我有一个声明为main_dict = Counter()
的计数器,并将值添加为main_dict[word] += 1
。最后,我想删除频率小于15的所有元素。 Counters
中是否有任何功能可以执行此操作。
任何帮助表示感谢。
答案 0 :(得分:19)
不,您需要手动删除它们。使用itertools.dropwhile()
可能会更容易:
from itertools import dropwhile
for key, count in dropwhile(lambda key_count: key_count[1] >= 15, main_dict.most_common()):
del main_dict[key]
演示:
>>> main_dict
Counter({'baz': 20, 'bar': 15, 'foo': 10})
>>> for key, count in dropwhile(lambda key_count: key_count[1] >= 15, main_dict.most_common()):
... del main_dict[key]
...
>>> main_dict
Counter({'baz': 20, 'bar': 15})
使用dropwhile
您只需要测试计数为15或以上的密钥;之后它会放弃测试,只是通过一切。这对于排序的most_common()
列表非常有用。如果有很多值低于15,那么可以节省所有这些测试的执行时间。
答案 1 :(得分:9)
>>> main_dict = Counter({'apple': 20, 'orange': 14, 'mango': 26, 'banana': 12})
>>> for k in main_dict:
if main_dict[k] < 15:
del main_dict[k]
>>> main_dict
Counter({'mango': 26, 'apple': 20})
答案 2 :(得分:6)
另一种方法:
c = Counter({'baz': 20, 'bar': 15, 'foo': 10})
print Counter(el for el in c.elements() if c[el] >= 15)
# Counter({'baz': 20, 'bar': 15})
答案 3 :(得分:2)
我可以建议另一个解决方案
from collections import Counter
main_dict = Counter({'baz': 20, 'bar': 15, 'foo': 10})
trsh = 15
main_dict = Counter(dict(filter(lambda x: x[1] >= trsh, main_dict.items())))
print(main_dict)
>>> Counter({'baz': 20, 'bar': 15})
我也有同样的问题,但是我需要从Counter返回一个列表,其中包含超过某个阈值的值。要做到这一点
keys_list = map(lambda x: x[0], filter(lambda x: x[1] >= trsh, main_dict.items()))
print(keys_list)
>>> ['baz', 'bar']
答案 4 :(得分:0)
An elegant solution when the threshold is zero:
main_dict += Counter()
答案 5 :(得分:0)
关于如何过滤计数大于或小于计数器阈值的项目的示例
from collections import Counter
from itertools import takewhile, dropwhile
data = (
"Here's a little song about Roy G. Biv. "
"He makes up all the colors that you see where you live. "
"If you know all the colors, sing them with me: "
"red, orange, yellow, green, blue, indigo, violet all that you see."
)
c = Counter(data)
more_than_10 = dict(takewhile(lambda i: i[1] > 10, c.most_common()))
less_than_2 = dict(dropwhile(lambda i: i[1] >= 2, c.most_common()))
print(f"> 10 {more_than_10} \n2 < {less_than_2}")
输出:
> 10 {' ': 40, 'e': 23, 'o': 16, 'l': 15, 't': 12}
2 < {"'": 1, 'R': 1, 'G': 1, 'B': 1, 'p': 1, 'I': 1, 'f': 1, ':': 1}
答案 6 :(得分:0)
只需对字典项进行列表理解:
[el for el in c.items() if el[1] >= 15]