3 回答
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,这可以代替我上面使用的电话。
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
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]
添加回答
举报