2016-07-29 79 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