我想在列表中填入列表中各种项目的计数,但仅限于计数超过一定数量时。 (这是在Python 2.7中)
例如:
x = [2,3,4,2,3,5,6]
如果我只想要出现两次或更多的数字,我只想要
d = {2: 2, 3: 2}
作为输出。
我想用字典理解来做这件事,例如
{(num if x.count(num) >= 2): x.count(num) for num in x}
但这会引发“无效语法”错误,似乎我需要设置一些默认密钥,这意味着我不想将某些密钥添加到字典中,然后我必须将其删除。
我现在正在做的有两行:
d = {(num if x.count(num) >= 2 else None): x.count(num) for num in x}
d.pop(None, None)
但是有没有办法在一个方面做到这一点,或者用if语句进行字典理解而不实际为else语句添加任何默认密钥?
答案 0 :(得分:3)
使用Counter
计算x
中的每个项目,使用字典理解来提取计数大于或等于阈值的值(例如2)。
from collections import Counter
x = [2, 3, 4, 2, 3, 5, 6]
threshold = 2
c = Counter(x)
d = {k: v for k, v in c.iteritems() if v >= threshold}
>>> d
{2: 2, 3: 2}
答案 1 :(得分:1)
有效:
{ i: x.count(i) for i in x if x.count(i) >= 2}
if
部分必须在for
之后,而不是之前,这就是您收到语法错误的原因。
为了避免计算元素两次,并且没有任何额外的导入,你也可以使用两个嵌套的理解(实际上内部的是一个生成器,以避免迭代完整列表两次):
>>> { j: n for j, n in ((i, x.count(i)) for i in x) if n >= 2}
{2: 2, 3: 2}
答案 2 :(得分:0)
表达式中的测试:(num if x.count(num) >= 2 else None)
来得太晚了:您已经指示dict comp发出值。你必须事先将其过滤掉。
将条件从三元移动到理解的过滤器部分:
x = [2,3,4,2,3,5,6]
d = {num: x.count(num) for num in x if x.count(num) >= 2}
说,这种方法效果不是很好,因为它会对元素进行两次计算。
过滤Counter
代替:
import collections
d = {num:count for num,count in collections.Counter(x).items() if count>=2}
答案 3 :(得分:0)
这应该有效:
a = [1,2,2,2,3,4,4,5,6,2,2,2]
{n: a.count(n) for n in set(a) if a.count(n) >= 2}
{2: 6, 4: 2}