比较复杂的列表

时间:2016-07-29 21:32:35

标签: python list duplicates

所以我在python中有一个包含列表的列表的函数,我正在尝试比较列表的内容,看看我是否有重复,然后如果有重复则返回True。基本上是这样的东西;

def dupCheck():
    aList = ([3.3,3.2], [1,1], [3.3,3.2], [7,7])
    if duplicates in aList:
        return True
    return False

3 个答案:

答案 0 :(得分:4)

你可以懒惰地做,在第一个副本上返回True代替先创建一个整个集合:

def dup_check(lst):
    seen = set()
    for tup in map(tuple, lst):
        if tup in seen:
            return True
        seen.add(tup)
    return False

要保持延迟评估,您应该使用 itertools.imap 代替 map 使用python2。

如果您想要接近一个班轮解决方案,您可以利用 set.add 返回None并与任何结合的事实:

def dup_check(lst):
    seen = set()
    return any(tup in seen or seen.add(tup) for tup in map(tuple, lst))

seen.add(tup)总是并且只有当我们已经添加了相同的元组时才会看到 tup 返回True所以任何< / em>将在第一个欺骗中短路或在没有欺骗的情况下返回False。

答案 1 :(得分:2)

通常在检查列表是否有重复项时,您只需从列表中创建set,从而删除重复项,然后将该项集的大小与原始列表的大小进行比较。在这种情况下,这是不可能的,因为嵌套列表不可清除,因此无法添加到集合中。但是,如果您始终有列表列表(而不是列表和其他内容列表,或列表列表),那么您可以将子列表转换为元组,然后再将它们放入集合中。

>>> def dupCheck(lst):
...     return len(set(tuple(l) for l in lst)) != len(lst)  # duplicates -> true
...    
>>> dupCheck([[3.3,3.2], [1,1], [3.3,3.2], [7,7]])
True

答案 2 :(得分:1)

列表问题列表的解决方案:

def remove_doubles(a):
    """Removes list doubles in list where list(set(a)) will raise a TypeError."""
    clean_list = []
    for b in a:
        if b not in clean_list:
            clean_list += [b]
    return clean_list