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

问题描述 投票:1回答:2

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

...虽然有效,但我认为有更好的解决方法。有人可以提供可能的解决方法吗?

问候。

python python-3.x
2个回答
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

当然,两个版本都要求可迭代的元素是可清除的。


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
© www.soinside.com 2019 - 2024. All rights reserved.