检查元组中的两个元素是否具有相同的值

时间:2018-11-03 11:32:26

标签: python python-3.x

我是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

...有效,但我认为对此有更好的解决方法。谁能提供可能的解决方法?

致谢。

2 个答案:

答案 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

不适用于无限迭代器:)

〜编辑〜

一个更通用的版本,无需预先构建可能很长的listset

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