使用Python从Counter中获取计数<50元素时得到空Counter的问题
问题分析与解决
原代码的问题
你用dropwhile的逻辑完全搞反了:
dropwhile的作用是跳过所有满足条件的元素,直到遇到第一个不满足条件的元素,然后返回该元素及之后的所有内容。- 你的lambda是
lambda key_count: key_count[1] < 50,但countered.most_common()是按计数从高到低排序的,前两个元素(100、70)都不满足<50,所以dropwhile不会跳过任何元素,直接返回全部4个元素。循环里把这些key全删了,最后自然得到空的Counter。
正确解法
方法1:直接生成新的筛选后的Counter(推荐)
这种方式最直观,直接通过字典推导式筛选出计数<50的元素:
from collections import Counter # 初始化你的Counter countered = Counter({ 'Required Weather API': 100, 'New York City Museums': 70, 'New York City Art Galleries': 48, 'Zillow Home Value Searching API': 38 }) # 筛选计数小于50的元素 filtered_counter = Counter({k: v for k, v in countered.items() if v < 50}) print(filtered_counter.most_common())
输出结果:
[('New York City Art Galleries', 48), ('Zillow Home Value Searching API', 38)]
方法2:修改原Counter(删除不符合条件的元素)
如果需要直接修改原Counter,先收集所有要删除的key(避免迭代时修改原字典导致的问题):
from collections import Counter countered = Counter({ 'Required Weather API': 100, 'New York City Museums': 70, 'New York City Art Galleries': 48, 'Zillow Home Value Searching API': 38 }) # 收集所有计数>=50的key keys_to_remove = [k for k, v in countered.items() if v >= 50] for k in keys_to_remove: del countered[k] print(countered.most_common())
方法3:用dropwhile实现(调整条件)
如果你非要用dropwhile,需要把条件改成跳过所有计数>=50的元素,剩下的就是要保留的:
from itertools import dropwhile from collections import Counter countered = Counter({ 'Required Weather API': 100, 'New York City Museums': 70, 'New York City Art Galleries': 48, 'Zillow Home Value Searching API': 38 }) # 跳过计数>=50的元素,保留剩下的 filtered_items = list(dropwhile(lambda x: x[1] >= 50, countered.most_common())) filtered_counter = Counter(dict(filtered_items)) print(filtered_counter.most_common())
内容的提问来源于stack exchange,提问作者nerd
相关产品推荐
相关产品推荐

