首页 > 解决方案 > 如何在不使用稳定排序的情况下使用 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()它是一个执行“稳定排序”的函数,即如果有相同的键,它将保持顺序不变。

所以这里发生的事情就像一个强稳定的排序。我想要更像一个软排序,它会考虑到顺序,但会将相同的元素放在一起。

标签: pythonpython-3.xsorting

解决方案


您可以使用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() 返回计数器中的所有元素。具有相同计数的元素按最先遇到的顺序排序


推荐阅读