我是Python的新手,当我遇到一个小小的逻辑障碍时,我正在开展一个小项目。我有一个包含100个字符串值的元组(比方说)。现在,我想检查元组中的两个字符串元素是否相同?
如此简化我希望实现这样的目标:
arr = ('abc', 'bcd', 'sdf', 'abc', 'pqr', ...)
# A logic to check if any two string elements are same
# eg. if arr[1] == arr[2] or arr[1] == arr[3] or ...
# But checking like this for 100 variables is not feasible
return True
我尝试用嵌套循环做这样的事情:
ctr = 0
arr = ('abc', 'bcd', 'sdf', 'abc', 'pqr', ...)
for m in arr:
for n in arr:
if n == m:
ctr+=1
# 100 because while looping, 100 times every element
# will be compared with itself
if(ctr > 100):
return True
...虽然有效,但我认为有更好的解决方法。有人可以提供可能的解决方法吗?
问候。
如果我理解正确,你可以将你的tuple
转换为set
并检查它是否与原始元组具有相同的长度。
def has_duplicates(iterable):
l = list(iterable) # in case iterable is an iterator
return len(set(l)) != len(l)
演示:
>>> tup = ('abc', 'bcd', 'sdf', 'abc', 'pqr')
>>> has_duplicates(tup)
>>> True
>>> has_duplicates(range(100))
>>> False
无法为无限迭代器工作:)
〜编辑〜
一个更通用的版本,不需要预先构建一个可能很长的list
和set
:
def has_duplicates(iterable):
seen = set()
for x in iterable:
if x in seen:
return True
seen.add(x)
return False
当然,两个版本都要求可迭代的元素是可清除的。
您还可以使用any
对象中的count
关键字和list
方法来检查:
arr = ('abc', 'bcd', 'sdf', 'abc', 'pqr')
def sameStrings(arr):
return any(arr.count(elem)>1 for elem in list(arr))
print(sameStrings(arr))
输出:
True
编辑
使用Counter
模块中的collections
更新@timgeb提出的解决方案的答案:
from collections import Counter
arr = ('abc', 'bcd', 'sdf', 'abc', 'pqr')
def sameStrings(arr):
myCounter = Counter(list(arr))
return max(myCounter.values())>1
print(sameStrings(arr))
输出:
True