检查列表是否有重复列表

Don*_*Don 10 python duplicates

给定一个列表列表,我想确保没有两个列表具有相同的值和顺序.例如,my_list = [[1, 2, 4, 6, 10], [12, 33, 81, 95, 110], [1, 2, 4, 6, 10]]它应该返回给我重复列表的存在,即[1, 2, 4, 6, 10].

我使用while但它不能按我的意愿工作.有人知道如何修复代码:

routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]
r = len(routes) - 1
i = 0
while r != 0:
    if cmp(routes[i], routes[i + 1]) == 0:
        print "Yes, they are duplicate lists!"
    r -= 1
    i += 1
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 11

你可以计算列表理解中的出现次数,将它们转换为a,tuple这样你就可以散列并应用unicity:

routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]
dups = {tuple(x) for x in routes if routes.count(x)>1}

print(dups)
Run Code Online (Sandbox Code Playgroud)

结果:

{(1, 2, 4, 6, 10)}
Run Code Online (Sandbox Code Playgroud)

很简单,但由于反复调用,很多循环在引擎盖下count.还有另外一种方法,它涉及哈希但具有较低的复杂性将是使用collections.Counter:

from collections import Counter

routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]

c = Counter(map(tuple,routes))
dups = [k for k,v in c.items() if v>1]

print(dups)
Run Code Online (Sandbox Code Playgroud)

结果:

[(1, 2, 4, 6, 10)]
Run Code Online (Sandbox Code Playgroud)

(只计算元组转换的子列表 - 修复散列问题 - 并使用列表理解生成重复列表,仅保留多次出现的项目)

现在,如果你只想检测到有一些重复的列表(没有打印它们),你可以

  • 将列表列表转换为元组列表,以便您可以在集合中对它们进行哈希处理
  • 比较列表的长度与集合的长度:

如果有一些重复,len是不同的:

routes_tuple = [tuple(x) for x in routes]    
print(len(routes_tuple)!=len(set(routes_tuple)))
Run Code Online (Sandbox Code Playgroud)

或者,能够map在Python 3中使用是非常罕见的,所以提到:

print(len(set(map(tuple,routes))) != len(routes))
Run Code Online (Sandbox Code Playgroud)

  • 的Bleh.当你已经使用元组和基于散列的数据结构时,所有那些`list.count`调用?如果你使用`collections.Counter`而不是`set`和`list.count`,你可以得到通常情况下的计数O(n)而不是O(n ^ 2). (2认同)