当count超过阈值时,Python会计算字典理解中的元素

时间:2017-08-24 07:03:49

标签: python python-2.7 dictionary-comprehension

我想在列表中填入列表中各种项目的计数,但仅限于计数超过一定数量时。 (这是在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语句添加任何默认密钥?

4 个答案:

答案 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}