【问题标题】:How to sort dictionary values by frequency如何按频率对字典值进行排序
【发布时间】:2021-11-22 00:36:53
【问题描述】:

因为我用附加列表创建了我的dict 文件。我有以下 dict 文件:

dict_1 = {'a':["1","2","d","d","d","1","2","2"], 
          'b':["1","2","e","e","5","5","5","6"]}

如何在list 中按frequency 对值进行排序,以便得到如下输出:

dict_1 = {'a':["d","d","d","2","2","2","1","1"], 
          'b':["5","5","5","e","e","6","2","1"]}

相同频率的字符串顺序无关

我试过了

result=[]
for k,v in dict_1.items():
    result.append(sorted(v, key = v.count,
                                reverse = True))

得到了

[['2', 'd', 'd', 'd', '2', '2', '1', '1'],
 ['5', '5', '5', 'e', 'e', '1', '2', '6']]

第一个列表中的“2”有问题。

谢谢。

【问题讨论】:

  • 这能回答你的问题吗? Sort list by frequency
  • 它发生的原因是因为例如'2''d' 在第一个列表中出现的次数相同 (3),因此在对该列表进行排序时,没有理由将个人 '2''d' 按任何特定顺序排列 - 因此它们彼此不分开。寻求此问题帮助的诀窍是要了解您不仅要尝试排序,还要对值进行分区 - 将类似的值组合在一起,按频率对组进行排序,并发出相应的输出。
  • 顺便说一句,请阅读*.com/help/minimal-reproducible-example。显然,这里的困难not“我如何将这种自定义排序应用于字典中的每个值?”,因此您应该不包括问问题时的那部分代码。相反,请专门询问如何对单个列表进行排序。显然,一旦你知道如何做到这一点,你就可以解决整个问题。

标签: python


【解决方案1】:

使用collections.Counterdict 理解的一种方式:

from collections import Counter

cnts = {k: Counter(v) for k, v in dict_1.items()}

或者没有Counter,使用list.count

cnts = {k: {i: v.count(i) for i in set(v)} for k, v in dict_1.items()}

然后进行排序:

{k: sorted(v, key=lambda x: (cnts[k][x], x), reverse=True) for k, v in dict_1.items()}

输出:

{'a': ['d', 'd', 'd', '2', '2', '2', '1', '1'],
 'b': ['5', '5', '5', 'e', 'e', '6', '2', '1']}

注意:

key for sorted 返回 tuple of (count, itself),以便相同的项目保持分组。

【讨论】:

  • 谢谢。我仍在寻找一种无需 Counter 的方法。
  • @Iwishworldpeace 添加了一个没有的示例。
  • 非常感谢。这提供了不同的排序视角!
【解决方案2】:

这是一种在 python 中不使用集合模块的方法。

dict_1 = {'a':["1","2","d","d","d","1","2","2"], 
          'b':["1","2","e","e","5","5","5","6"]}

for items in dict_1: # looping through the dictionary to get every key value pair in the dictionary

    l = dict_1.get(items) # getting the value of every key value pair in the dictionary. Here "l" is short for "list"
    print(sorted(l, key=l.count, reverse=True)) # sorting it according to frequency of the element in the list.

输出:

['2', 'd', 'd', 'd', '2', '2', '1', '1']
['5', '5', '5', 'e', 'e', '1', '2', '6']

你可以从this link阅读更多关于sorted()的信息

【讨论】:

  • 谢谢。但是输出和我的结果一样。
  • 你确定你复制了我写的确切代码吗?你得到这个结果是因为你将这些列表附加到另一个空列表中
  • 是的。我想我找到了问题所在。谢谢你。我没有说清楚。
  • 最欢迎您
最近更新 更多