python - 如何在不使用稳定排序的情况下使用 Python 对可迭代进行排序?
问题描述
所以,我在 Input 中有一个这样的迭代:
[4, 6, 2, 2, 6, 4, 4, 4]
我想根据降低的频率顺序对其进行排序。所以结果将是这样的:
[4, 4, 4, 4, 6, 6, 2, 2]
所以这里发生的事情是,当一个元素与另一个元素具有相同的频率时,它们的顺序将相同(6 先出现,所以 6 在 2 之前)。
我尝试使用 sorted 函数来实现这种机制,但我遇到了一个大问题。
def frequency_sort(items):
return sorted(items, key=lambda elem: sum([True for i in items if i == elem]), reverse=True)
我知道这种简短的方法很难阅读,但它只是使用 key 参数对数组进行排序以提取数字的频率。但是,输出是这样的:
[4, 4, 4, 4, 6, 2, 2, 6]
如您所见,输出与应有的略有不同。这发生了(我认为)因为sorted()
它是一个执行“稳定排序”的函数,即如果有相同的键,它将保持顺序不变。
所以这里发生的事情就像一个强稳定的排序。我想要更像一个软排序,它会考虑到顺序,但会将相同的元素放在一起。
解决方案
您可以使用collections.Countermost_common
并按频率降序使用该返回值:
from collections import Counter
def frequency_sorted(lst):
counts = Counter(lst)
return [k for k, v in counts.most_common() for _ in range(v)]
result = frequency_sorted([4, 6, 2, 2, 6, 4, 4, 4])
print(result)
输出
[4, 4, 4, 4, 6, 6, 2, 2]
从most_common的文档中:
返回 n 个最常见元素的列表及其从最常见到最少的计数。如果 n 被省略或没有,most_common() 返回计数器中的所有元素。具有相同计数的元素按最先遇到的顺序排序
推荐阅读
- azure - Azure 数据工厂未加载
- javascript - 对深度嵌套对象进行递归迭代以找到父对象
- mysql - 依靠触发器
- html - CSS:滚动条始终可见而不减小容器的宽度
- cloud - 从 Raspberry Pi 访问 My Cloud Home 文件
- python - Python 机会游戏
- r - 从 lme 或 lmerMod 对象绘制 R 中单个二次增长曲线的随机子集?
- python - TFRecord 特征值错误
- java - 在我的“floatingservice”类上单击“textview”后,我想回到我的片段屏幕
- list - 如何在每个循环中将元素添加到同一个列表中,Prolog