检查列表是否有重复列表

时间:2017-01-23 15:18:45

标签: 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

5 个答案:

答案 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

享受!