首页 > 解决方案 > 如何从 dictionary.values() Python 中获取最常见的单词或按字母顺序排列的情况

问题描述

尝试从字典中获取每个键的最常见值,例如:

{'cars': ['sedan', 'sedan', 'van', 'van'], 'snack': ['chips', 'chips', 'cheetos'], 'computer': ['laptop', 'desktop']}

但是,如果出现平局,它应该按字母顺序返回值列表中的第一个单词

已经尝试过collections.Counter,但如果有平局,它会返回任意值。我也知道有些帖子显示了如何为字典查找最常见的值,但它们没有解决出现平局时的字母顺序。

例如,上面的字典应该返回:

{'cars': 'sedan', 'snack':'chips', 'computer':'desktop'}

任何帮助深表感谢。

标签: python-3.x

解决方案


这看起来很简单,但需要大量转换才能获得正确的结果

使用counter是正确的方法,但您必须对项目进行排序。请注意,该most_common方法不起作用/非常无用,因为使用1as 参数来限制结果的数量可以选择“错误”条目:

{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在选择第一个元素时会引发一个)。


推荐阅读