Python中按元素频率升序排序列表失效,求解决方法
问题原因及解决方案
原代码问题
你的代码中使用new.sort(key=lambda x: new.count(x))时,由于list.sort()是原地排序,排序过程中列表元素的位置会动态变化,导致new.count(x)每次计算的是当前排序中列表的元素出现次数,而非原始列表的真实频率,最终输出不符合预期。
解决方法
方法1:使用collections.Counter预统计频率
先一次性统计好原始列表中每个元素的出现频率,再用该频率作为排序依据:
from collections import Counter new = [10, 15, 5, 7, 10, 7, 7] freq = Counter(new) new.sort(key=lambda x: freq[x]) print(new)
输出:[15, 5, 10, 10, 7, 7, 7]
方法2:手动统计频率(无需导入模块)
如果不想使用Counter,可以用字典手动统计频率:
new = [10, 15, 5, 7, 10, 7, 7] freq = {} for num in new: freq[num] = freq.get(num, 0) + 1 new.sort(key=lambda x: freq[x]) print(new)
同样会得到符合期望的输出。
扩展:相同频率元素的额外排序规则
如果需要对相同频率的元素按值排序(比如升序),可以将排序key设为元组,同时指定频率和元素值:
new.sort(key=lambda x: (freq[x], x))
此时输出会变为[5, 15, 10, 10, 7, 7, 7],相同频率的元素按值从小到大排列。
内容的提问来源于stack exchange,提问作者Birajananda Patra
相关产品推荐
相关产品推荐

