Python中按字母出现次数过滤计数结果的简洁实现方案
如何过滤字母计数结果中出现次数≥3的项?
我的现有代码与结果
我目前用这段代码统计单词中各字母的出现次数:
mylist = list("asmoranomardicadaistinaculdacar") [[x,mylist.count(x)] for x in set(mylist)]
执行后得到的结果是:
[['n', 2], ['r', 3], ['u', 1], ['m', 2], ['t', 1], ['a', 8], ['l', 1], ['s', 2], ['o', 2], ['i', 3], ['c', 3], ['d', 3]]
我的需求
我希望仅保留出现次数大于等于3的字母计数项,并且想找到简洁的一行代码实现方案,目前自己的Python能力还不足以写出最优解,求指导。
解决方案
其实你只需要在原列表推导式里加一个条件判断,就能实现一行代码过滤:
[[x, mylist.count(x)] for x in set(mylist) if mylist.count(x) >= 3]
不过上面的写法会重复调用count()(生成元素和判断条件各一次),如果字符串很长的话效率稍低。你也可以先生成完整的计数列表,再过滤,同样是一行:
filtered = [item for item in [[x, mylist.count(x)] for x in set(mylist)] if item[1] >= 3]
更推荐的是用Python内置的collections.Counter,它专门做计数统计,只需要遍历一次字符串就能完成计数,代码更清晰且性能更好,同样可以写成简洁的形式:
from collections import Counter filtered = [[char, cnt] for char, cnt in Counter("asmoranomardicadaistinaculdacar").items() if cnt >= 3]
执行后得到的目标结果是:
[['r', 3], ['a', 8], ['i', 3], ['c', 3], ['d', 3]]
补充说明
- 第一种列表推导式写法最直接,适合快速实现,但数据量大时存在重复遍历的性能损耗;
- 第二种写法先完成所有计数再过滤,避免了重复调用
count(); Counter是最优方案,不仅效率更高,代码可读性也更强,日常处理计数类问题都可以优先考虑它。
内容的提问来源于stack exchange,提问作者Whitehot
相关产品推荐
相关产品推荐

