2016-08-16 65 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