为了账号安全,请及时绑定邮箱和手机立即绑定

在多个列表中查找重复的值

在多个列表中查找重复的值

汪汪一只猫 2021-03-15 10:43:14
我正在尝试查找其中的任何子列表list1是否具有重复的值,因此需要告诉我list1 [0]中的数字是否与list [1]中的数字相同(重复20)数字代表座标,并且list1中每个项目的座标不能重叠,如果这样做,那么我有一个模块可以重新运行一个新的list1,直到没有座标是请帮忙    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
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

怎么样:


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)

要检查所有列表中是否仅重复一项,我将其链接并检查。归功于此答案可以使列表列表变平。


flattened = sum(list1, [])

if len(flattened) > len(set(flattened)):

  print ("dups")

else:

  print ("no dups")

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


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

sum如果这看起来像hack,这可以代替我上面使用的电话。


查看完整回答
反对 回复 2021-03-31
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

更新问题的解决方案

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


查看完整回答
反对 回复 2021-03-31
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

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]


查看完整回答
反对 回复 2021-03-31
  • 3 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信