2013-10-27 52 views

回答

2

如果你只是想測試一個數是否有任何元素是重複的,但你不在乎他們是哪些,你可以簡單地做:

len(list) == len(set(list)) 

但是,這可能是也可能不是最有效的實現。

5

可以使用collections.Counter對象來獲取所有的重複元素的列表:

>>> from collections import Counter 
>>> 
>>> l = [1,2,2,3,4] 
>>> 
>>> [k for k,v in Counter(l).iteritems() if v > 1] 
[2] 

如果只是要檢查是否存在重複,但不關心什麼,其實就是複製,然後比較該列表的長度與該組中包含的列表中的元素的長度:

>>> len(l) != len(set(l)) 
True 

如果有重複,該組的長度將比列表的小。如果沒有,這兩個長度將是相等的。

+0

Downvoter:請發表評論。我想知道這個答案有什麼問題。 – arshajii

+0

是的,那就是我。答案不會短路,你使用'l'作爲變量名,並且沒有提到這種方法需要元素是可散列的。 – wim

+0

@wim我會逐個解決你的問題。 1)你的答案沒有短路是正確的。 OP沒有告訴我們他計劃使用多大的列表,所以我推測效率不是這裏的主要因素。我堅持這一點,因爲我不會犧牲這條線的可讀性和簡單性,以達到可能不需要的效率。當然,我的假設可能不正確,在這種情況下,OP可以自由使用不同的方法。(待續) – arshajii

5

Counter(List1)set(List1)的問題是他們不能短路。所以,如果列表1有一百萬的項目,你需要你得到你的答案之前處理整個列表

假設我們有

List1 = [1, 2, 2, 3, 4] 

def has_duplicate(List1) 
    s = set() 
    for item in List1: 
     if item in s: 
      return True 
     s.add(item) 
    return False 

現在的功能可以只查看3項

此之後返回如果List1只包含可排列的項目,那很好。如果有非哈希的項目,你可以解壓縮到一個單獨的列表,只是.count()方法@基督教的回答

如果有人確實需要快速做到這一點,同樣的邏輯可以用來做一個版本的set構造函數並編譯成本地函數。

+2

重要的是要注意,儘管這會造成短路,但它也是用python實現的。失敗的時間要比其他兩種方法的時間要長。根據您的使用情況,清單中有多少項目,以及您期望找到重複項目的頻率,無論哪種方式可能會更快。如果您擔心性能,測試很重要。 – OmnipotentEntity

+0

@OmnipotentEntity,是的,當問題沒有涵蓋所有的未知數時,很難得到單一的最佳答案。還有一個複雜因素是性能會因不同的Python實現而有所不同。 –