2012-06-28 51 views
2

有沒有辦法找到一個列表是否包含重複項。例如:用Python查找重複項的方法

list1 = [1,2,3,4,5] 
list2 = [1,1,2,3,4,5] 

list1.*method* = False # no duplicates 
list2.*method* = True # contains duplicates 
+1

是這個假設列表總是排序? – tyjkenn

+0

可能的重複:http://stackoverflow.com/questions/1920145/how-to-find-duplicate-elements-in-array-using-for-loop-in-python-like-cc – tyjkenn

+1

@tyjkenn:檢查是否存在的重複比找到實際的重複更簡單(這是另一個問題的重點)。 – interjay

回答

14

如果您將列表臨時轉換爲集合,那將消除集合中的重複項。然後可以比較列表和設置的長度。

在代碼中,它應該是這樣的:

list1 = [...] 
tmpSet = set(list1) 
haveDuplicates = len(list1) != len(tmpSet) 
+2

+1包括一些實際的文本來解釋你在做什麼,而不是隻是淹沒代碼。 – jdi

+1

@jdi:我實際上試過只是簡單地放下一些代碼,但它至少在30個字符以下。 – 3Doubloons

+0

我想讓我的+1回來! – jdi

2

轉換列表中的一組刪除重複。比較原始列表和集合的長度,看看是否存在重複。

>>> list1 = [1,2,3,4,5] 
>>> list2 = [1,1,2,3,4,5] 
>>> len(list1) == len(set(list1)) 
True # no duplicates 
>>> len(list2) == len(set(list2)) 
False # duplicates 
2

檢查原始列表的長度是否大於列表中元素的唯一「集合」的長度。如果是這樣,一定會有重複

list1 = [1,2,3,4,5] 
list2 = [1,1,2,3,4,5] 

if len(list1) != len(set(list1)): 
    #duplicates 
0

set()方法只適用於哈希的對象,所以對於completness,你可以只用簡單的迭代做到這一點:

import itertools 

def has_duplicates(iterable): 
    """ 
    >>> has_duplicates([1,2,3]) 
    False 
    >>> has_duplicates([1, 2, 1]) 
    True 
    >>> has_duplicates([[1,1], [3,2], [4,3]]) 
    False 
    >>> has_duplicates([[1,1], [3,2], [4,3], [4,3]]) 
    True 
    """ 
    return any(x == y for x, y in itertools.combinations(iterable, 2)) 
+0

哎。這一個傷害了複雜性。最好爲你的不可對象編寫散列函數。 –

+0

@JoelCornett介意爲''list'做些什麼? – lqc

+0

'listHash = lambda x:hash(tuple(x))''。請注意,由於此散列只是一次性事物,因此您不必擔心對象會隨着您的變化而變化。 –