所以我在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
答案 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