2016-07-29 119 views
0

所以我有一个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

有像SO和代码审查6个问题已有关于这个主题。你应该先询问才能搜索。 – Rockybilly

+0

好吧,这是一个不错的(破碎)功能。我不确定你期望我们做什么,因为**你实际上没有提出问题。** –

回答

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

完全是pythonic的做法! –

+0

问题:这是一个很好的解决方案,但它会触摸列表中的ever元素。不会有更有效的解决方案来构建一套'看过的'。通过元素循环,如果看到元素,返回True,否则seen.add(元素)。循环后,返回False ... –

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地图使用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。

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