当前位置:  开发笔记 > 编程语言 > 正文

检查列表是否有重复列表

如何解决《检查列表是否有重复列表》经验,为你挑选了1个好方法。



1> Jean-Françoi..:

你可以计算列表理解中的出现次数,将它们转换为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)

结果:

{(1, 2, 4, 6, 10)}

很简单,但由于反复调用,很多循环在引擎盖下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)

结果:

[(1, 2, 4, 6, 10)]

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

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

将列表列表转换为元组列表,以便您可以在集合中对它们进行哈希处理

比较列表的长度与集合的长度:

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

routes_tuple = [tuple(x) for x in routes]    
print(len(routes_tuple)!=len(set(routes_tuple)))

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

print(len(set(map(tuple,routes))) != len(routes))


的Bleh.当你已经使用元组和基于散列的数据结构时,所有那些`list.count`调用?如果你使用`collections.Counter`而不是`set`和`list.count`,你可以得到通常情况下的计数O(n)而不是O(n ^ 2).
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有