对collections.Counter使用max不符合预期,是否应支持返回最高频元素?
问题原因说明
Counter是Python中dict的子类,直接迭代Counter对象时默认遍历的是它的键(也就是统计的元素本身),所以你调用max(c)时,等价于对所有键做大小比较,你的示例中字符'c'的ASCII编码大于'a'和'b',所以才会返回'c',这个行为是为了保持和普通字典的逻辑一致,并不是设计缺陷。
更简洁的最高频元素获取方式
你不需要修改Counter的默认行为,只要给max函数指定key参数即可实现需求,写法比most_common调用更简洁:
>>> max(c, key=c.get) 'a'
c.get会返回对应键的统计频次,max会基于频次大小做比较,直接返回频次最高的元素。
关于是否支持Counter默认max返回最高频元素
目前没有合理的场景会修改这个默认逻辑:
- Counter作为dict子类,需要遵守里氏替换原则,保证所有适用于普通dict的操作,在Counter上也能得到符合预期的结果,如果修改默认迭代或者默认比较规则,会打破大量现有兼容dict的代码逻辑。
- 现有通过指定
key参数的方案已经足够简洁,完全可以替代most_common的繁琐写法,没有修改默认行为的必要。
如果需要同时获取最高频元素和对应的统计值,还是推荐用most_common方法,写法更清晰:
>>> most_elem, most_cnt = c.most_common(1)[0] >>> most_elem 'a' >>> most_cnt 4
内容的提问来源于stack exchange,提问作者Data Cyclist
相关产品推荐
相关产品推荐

