python-3.x - 如何从 dictionary.values() Python 中获取最常见的单词或按字母顺序排列的情况
问题描述
尝试从字典中获取每个键的最常见值,例如:
{'cars': ['sedan', 'sedan', 'van', 'van'], 'snack': ['chips', 'chips', 'cheetos'], 'computer': ['laptop', 'desktop']}
但是,如果出现平局,它应该按字母顺序返回值列表中的第一个单词。
已经尝试过collections.Counter
,但如果有平局,它会返回任意值。我也知道有些帖子显示了如何为字典查找最常见的值,但它们没有解决出现平局时的字母顺序。
例如,上面的字典应该返回:
{'cars': 'sedan', 'snack':'chips', 'computer':'desktop'}
任何帮助深表感谢。
解决方案
这看起来很简单,但需要大量转换才能获得正确的结果
使用counter
是正确的方法,但您必须对项目进行排序。请注意,该most_common
方法不起作用/非常无用,因为使用1
as 参数来限制结果的数量可以选择“错误”条目:
{k : collections.Counter(v).most_common(1) for k,v in d.items()} # no dice!!
产量{'cars': [('sedan', 2)], 'computer': [('desktop', 1)], 'snack': [('chips', 2)]}
接近我们想要的,但它也可以选择'van'
其他时间......
自然排序也不起作用,因为您需要根据出现次数(反转),然后是字母数字键进行排序。您需要一个复杂的排序键:
lambda i : (-i[1],i[0])
(i
是键/值对,-i[1]
元素个数相反,所以最高的数字在前,i[0]
是名字)
然后,选择第一个值,以及该值的第一项(丢弃计数)
像这样:
import collections
d = {'cars': ['sedan', 'sedan', 'van', 'van'], 'snack': ['chips', 'chips', 'cheetos'], 'computer': ['laptop', 'desktop']}
c = {k : sorted(collections.Counter(v).items(),
key = lambda i : (-i[1],i[0]))[0][0] for k,v in d.items() if v}
结果:
>>> c
{'cars': 'sedan', 'computer': 'desktop', 'snack': 'chips'}
请注意,if v
保护条件免受“一个列表为空”的情况(否则IndexError
在选择第一个元素时会引发一个)。
推荐阅读
- c# - 为什么在尝试更改 TextObject 的文本时出现错误
- javascript - 任何人都知道如何解决 npm start 错误:Error: assets.flatMap is not a function
- javascript - Javascript正则表达式删除十六进制字节?
- javascript - JavaScript 解析 CSV 文件并计算值
- android - 如何隐藏 ListPreference 的对话框或防止在 setOnPreferenceClickListener 方法中打开它,但当然不禁用首选项
- github - 如何查看 github 上的整个代码库?
- javascript - 如何将数据批量添加到 Google Apps 脚本
- python - 如何将列表转换为 numpy.void
- javascript - for 循环在 if 中的第一个 true 之后停止
- linux - 列出 Linux/Unix 中包含 zipfiles 的文件夹下的所有文件名