所以我有一个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
通常检查列表中是否有重复的时候,你只需创建从列表中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
完全是pythonic的做法! –
问题:这是一个很好的解决方案,但它会触摸列表中的ever元素。不会有更有效的解决方案来构建一套'看过的'。通过元素循环,如果看到元素,返回True,否则seen.add(元素)。循环后,返回False ... –
你可以做到这一点懒洋洋,在地方建立了一套完整的第一对第一重复返回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。
如果你想接近一个班轮解决方案,你可以采取的事实优势set.add回报无与任何结合:
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所以任何会在第一次重复时短路或者如果没有重复返回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和代码审查6个问题已有关于这个主题。你应该先询问才能搜索。 – Rockybilly
好吧,这是一个不错的(破碎)功能。我不确定你期望我们做什么,因为**你实际上没有提出问题。** –