在多个列表中查找重复值

时间:2013-06-08 22:23:15

标签: python

我试图找出list1中的任何子列表是否有重复值,所以我需要告诉我list1 [0]中的数字是否与列表[1]中的数字相同(其中20重复)

这些数字代表coords并且list1中每个项目的坐标不能超过一圈,如果他们这样做,那么我有一个模块重新生成一个新的列表1直到没有coords是smae

请帮助

    list1 = [[7, 20], [20, 31, 32], [66, 67, 68],[7, 8, 9, 2],
             [83, 84, 20, 86, 87], [144, 145, 146, 147, 148, 149]]

    x=0
    while x != 169:
        if list1.count(x) > 0:
        print ("repeat found")
    else:
        print ("no repeat found")
    x+=1

4 个答案:

答案 0 :(得分:3)

如下:

is_dup = sum(1 for l in list1 if len(set(l)) < len(l))
if is_dup > 0:
  print ("repeat found")
else:
  print ("no repeat found")

使用any的另一个例子:

any(len(set(l)) < len(l) for l in list1)

要检查在所有列表中是否只重复了一个项目,我会链接它们并检查。感谢this answer以展平列表列表。

flattened = sum(list1, [])
if len(flattened) > len(set(flattened)):
  print ("dups")
else:
  print ("no dups")

我想平整列表的正确方法是使用itertools.chain,可以这样使用:

flattened = list(itertools.chain(*list1))

如果这看起来像是黑客攻击,这可以取代我上面使用的sum来电。

答案 1 :(得分:2)

更新问题的解决方案

def has_duplicates(iterable):
    """Searching for duplicates in sub iterables.

    This approach can be faster than whole-container solutions
    with flattening if duplicates in large iterables are found 
    early.
    """
    seen = set()
    for sub_list in iterable:
        for item in sub_list:
            if item in seen:
                return True
            seen.add(item)
    return False


>>> has_duplicates(list1)
True
>>> has_duplicates([[1, 2], [4, 5]])
False
>>> has_duplicates([[1, 2], [4, 5, 1]])
True

一组中的查找速度很快。如果你希望它快速,请不要使用seen列表。

问题原始版本的解决方案

如果列表的长度大于此列表中设置的长度,则必须有重复的项目,因为一个集合只能有唯一的元素:

>>> L = [[1, 1, 2], [1, 2, 3], [4, 4, 4]]
>>> [len(item) - len(set(item)) for item in L]
[1, 0, 2]

这是关键

>>> {1, 2, 3, 1, 2, 1}
set([1, 2, 3])

修改

如果您对每个子列表的重复次数不感兴趣。这样会更有效,因为它在第一个数字大于0之后停止:

>>> any(len(item) - len(set(item)) for item in L)
True

感谢@mata指出这一点。

答案 2 :(得分:1)

from collections import Counter
list1=[[7, 20], [20, 31, 32], [66, 67, 68],
        [7, 8, 9, 2], [83, 84, 20, 86, 87],
        [144,144, 145, 146, 147, 148, 149]]
for i,l in enumerate(list1):
    for r in [x for x,y in Counter(x for x in l).items() if y > 1]:
        print 'at list ', i, ' item ', r , ' repeats'

,这个给出了全局重复的值:

expl=sorted([x for l in list1 for x in l])
print [x for x,y in zip(expl, expl[1:]) if x==y]

答案 3 :(得分:0)

对于Python 2.7+,您应该尝试Counter

import collections

list = [1, 2, 3, 2, 1]
count = collections.Counter(list)

然后算数就像:

Counter({1: 2, 2: 2, 3:1})

Read more