我是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
...有效,但我认为对此有更好的解决方法。谁能提供可能的解决方法?
致谢。
答案 0 :(得分:4)
如果我理解正确,则可以将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
当然,这两个版本都要求您的iterable元素具有可哈希性。
答案 1 :(得分:1)
您还可以使用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