如何检查单子中是否有重复项?

2024-04-20 02:08:44 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,给定列表['one', 'two', 'one'],算法应返回True,而给定['one', 'two', 'three'],算法应返回False


Tags: 算法falsetrue列表onethreetwo
3条回答

这是旧的,但这里的答案让我找到了一个稍微不同的解决方案。如果你准备滥用理解力,你可能会这样短路。

xs = [1, 2, 1]
s = set()
any(x in s or s.add(x) for x in xs)
# You can use a similar approach to actually retrieve the duplicates.
s = set()
duplicates = set(x for x in xs if x in s or s.add(x))

建议仅用于列表:

any(thelist.count(x) > 1 for x in thelist)

不要在长列表上使用它——它可能需要与列表中项目数的平方成正比的时间!

对于具有哈希项(字符串、数字和c)的较长列表:

def anydup(thelist):
  seen = set()
  for x in thelist:
    if x in seen: return True
    seen.add(x)
  return False

如果你的项目是不可散列的(子列表,dict等),它会变得更加毛茸茸的,尽管如果它们至少是可比的,仍然有可能得到O(N logN)。但您需要知道或测试项目的特性(是否可散列、可比较或不可比较),才能获得最佳性能--对于散列,为O(N),对于不可散列的可比较,为O(N logn),否则它将降为O(N平方),对此我们无能为力:-(。

如果所有值都是可散列的,则使用set()删除重复项:

>>> your_list = ['one', 'two', 'one']
>>> len(your_list) != len(set(your_list))
True

相关问题 更多 >