Python 比较复杂的列表

Python 比较复杂的列表,python,list,duplicates,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 通常,在检查列表是否有重复项时,您只需从列表中创建一个集合,从而删除重复项,然后将该集合的大小

我在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

通常,在检查列表是否有重复项时,您只需从列表中创建一个集合,从而删除重复项,然后将该集合的大小与原始列表的大小进行比较。在这种情况下,这是不可能的,因为嵌套列表是不可散列的,因此不能添加到集合中。但是,如果您总是有列表列表,而没有列表列表,例如列表列表和其他内容,或者列表列表,则可以在将子列表放入集合之前将其转换为元组

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

您可以惰性地执行此操作,在第一个副本上返回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代替使用python2的map

如果您想要一个接近一行的解决方案,可以利用set.add返回None并与any组合的事实:


seen.addtup始终为None,只有在我们已经添加了相同的元组的情况下,seen中的tup才会返回True,因此,如果没有重复,任何将在第一次重复时短路或返回False。

列表问题的解决方案:

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

在SO和codereview中,关于这个主题存在6个问题。你应该在询问之前搜索。好的,这是一个很好的函数。我不确定你到底希望我们做什么,因为你实际上没有问任何问题。完全是一种蟒蛇式的方式!问:这是一个简洁的解决方案,但它将触及列表中的任何元素。一个更有效的解决方案不是构建一组SEED吗。循环遍历元素,如果元素在seen中,则返回True,否则返回seen.addelement。循环后,返回False。。。
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