2016-08-16 59 views
5

如何在列表中找到雙打?我的算法如何在列表python中找到並保留雙精度值?

import collections 
a = [1,2,3,4,5,2,4,5] 
b = [] 

for x,y in collections.Counter(a).items(): 
    if y>1: 
     b.append(x) 

print(b) # [2, 4, 5] 

c = [] 
for item in a: 
    if item in b: 
     c.append(item) 

print(c) # [2, 4, 5, 2, 4, 5] 

的版本需要找到結果如c

代碼缺陷:

  1. 三甲之列(A,B,C),一個集合(字典)
  2. 長代碼

我需要離開列表雙打值,例如。 x = [1,2,2,2,3,4,5,6,6,7],需要[2,2,2,6,6]不是[2,6]

+0

是的,正如c列表print(c)#[2,4,5,2,4,5] – Igor

回答

14
from collections import Counter 

a = [1, 2, 3, 4, 5, 2, 4, 5] 
counts = Counter(a) 
print([num for num in a if counts[num] > 1]) 
+1

也可以使用計數作爲字典[[x for x,y in counts.items()如果y> 1]' – sberry

+1

雖然,如果訂單很重要,那麼發佈的解決方案是最好的。 – sberry

+1

該OP要求重複列表中返回。由於它是一本字典,遍歷這些項目不會那樣做。 – Karin

5

不是最有效的方式,但很簡潔:

a = [1,2,3,4,5,2,4,5] 
b = [x for x in a if a.count(x) > 1] 
print(b) 
+0

是的,'list.count'必須每次掃描整個列表,所以與Karin的O(n)解相比,這是O(n^2)。 OTOH,如果'a'很短,這個_might_會更快,因爲即使它在O(n)中運行,Counter也不是很快。 –

+2

這是正確的。卡琳的解決方案高效優雅。那種享受閱讀的代碼。 –

1

@Karin幾乎有它,我認爲,但最終的結果將不會是一套。

from collections import Counter 

a = [1, 2, 3, 4, 5, 2, 4, 5] 
counts = Counter(a) 
print({k for k, v in counts.items() if v >= 2}) 

編輯:啊, 「只留下雙打」

print([x for x in a if counts[x] >= 2]) 

EDIT2:額外的評論澄清OP的值與雙層或更頻繁的事情。

+1

OP需要一個包含重複項的列表(「我需要離開列表值,不僅是唯一的」)。所需的輸出是'[2,4,5,2,4,5]'。我花了一點時間來解釋:) – Karin

+1

另外,OP使用Python 3.x! ;) – dalanmiller

+1

此外,編輯仍然不會出於同樣的原因。如果計數是字典,鍵將始終是唯一的...因此,您仍然不會返回列表中的重複項。 – Karin

相關問題