如何按元素出现频率对字典的列表类型value进行排序
问题解决方法
问题根因
你原来的代码仅使用元素出现次数作为排序依据,相同出现次数的元素会保留在原列表中的相对顺序,不会按元素值聚合,因此会出现同值元素分散排布的问题,就是你看到的2和d交替出现的情况。
除此之外,直接在排序key中调用v.count会导致每个元素都遍历一次列表统计次数,时间复杂度为O(n²),列表较长时性能会非常差。
修复方案
先通过collections.Counter提前统计每个列表的元素频率,排序时同时使用「出现次数」和「元素本身」作为排序key,开启倒序即可:既可以保证同频率的同值元素聚合在一起,也能将时间复杂度降到O(n log n)。
from collections import Counter dict_1 = {'a':["1","2","d","d","d","1","2","2"], 'b':["1","2","e","e","5","5","5","6"]} sorted_dict = {} for key, lst in dict_1.items(): freq = Counter(lst) # 排序规则:先按频率倒序,同频率按元素值倒序,和你给出的预期输出完全匹配 sorted_lst = sorted(lst, key=lambda x: (freq[x], x), reverse=True) sorted_dict[key] = sorted_lst print(sorted_dict)
运行后输出结果为:
{'a': ['d', 'd', 'd', '2', '2', '2', '1', '1'], 'b': ['5', '5', '5', 'e', 'e', '6', '2', '1']}
完全符合你的需求。如果你不需要同频率元素按值倒序,只需要调整key里的第二个排序规则即可。
内容的提问来源于stack exchange,提问作者Iwishworldpeace
相关产品推荐
相关产品推荐

