鉴于列表清单,我想确保没有两个列表具有相同的值和顺序。例如,对于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
答案 0 :(得分:11)
你可以计算列表理解中的出现次数,将它们转换为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)))
或者,能够在Python 3中使用map
是非常罕见的,因此可以提及:
print(len(set(map(tuple,routes))) != len(routes))
答案 1 :(得分:3)
routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]
dups = set()
for route in routes:
if tuple(route) in dups:
print('%s is a duplicate route' % route)
else:
dups.add(tuple(route))
答案 2 :(得分:2)
不确定您是否需要外部库,但我有一个包含为此目的明确制作的功能:iteration_utilities.duplicates
>>> from iteration_utilities import duplicates
>>> my_list = [[1, 2, 4, 6, 10], [12, 33, 81, 95, 110], [1, 2, 4, 6, 10]]
>>> list(duplicates(my_list, key=tuple))
[[1, 2, 4, 6, 10]]
请注意,这也可以在没有key=tuple
的情况下运行,但会有O(n*n)
行为,而不是O(n)
。
>>> list(duplicates(my_list))
[[1, 2, 4, 6, 10]]
如果这很重要,它还会保持外观顺序(有或没有key
):
>>> list(duplicates([[1], [2], [3], [1], [2], [3]]))
[[1], [2], [3]]
如果您只对感兴趣如果有重复项,则可以使用any
代替list
:
>>> any(duplicates([[1], [2], [3], [1], [2], [3]]))
True
>>> any(duplicates([[1], [2], [3]]))
False
答案 3 :(得分:0)
for x in routes:
print x, routes.count(x)
将返回每个列表以及它出现的次数。 另外,您只能显示它们是否出现> 1:
new_list = []
for x in routes:
if routes.count(x)>1:
if x not in new_list:
new_list.append(x)
for x in new_list:
print x, routes.count(x)
希望它有所帮助!
答案 4 :(得分:0)
def duplicate(lst):
cntrin=0
cntrout=0
for i in lst:
cntrin=0
for k in lst:
if i==k:
cntrin=cntrin+1
if cntrin>1:
cntrout=cntrout+1
if cntrout>0:
return True
else:
return False
享受!