-1

我正在尝试根据元素的频率对列表进行排序。但是当列表排序列表未排序时,我得到两个不同的答案。请看下面的代码段。

有人可以解释原因。谢谢你。

from collections import Counter
l = [1,1,0,0,5,2,5,5,3,4,33,0]
# Stores the frequency of each element as {elem: freq}
c = Counter(l)

# Sorting the list based on the frequency of the elements
lst1 = sorted(l, key=lambda x: -c[x])
# lst1: [0, 0, 5, 5, 5, 0, 1, 1, 2, 3, 4, 33]

l.sort()
# Sorting the list based on the frequency of the elements
lst2 = sorted(l, key=lambda x: -c[x])
# lst2: [0, 0, 0, 5, 5, 5, 1, 1, 2, 3, 4, 33]
4

1 回答 1

1

两个结果都是正确的。

由于两次出现c[0]和都c[5]计算为3(在这种情况下),并且在这两种情况下仅使用该数字作为排序键,因此排序算法会将两个整数视为“相等”并根据遇到的顺序对它们进行排序。 .

查看文档sorted告诉我们这是排序算法的一个特性:

内置的 sorted() 函数保证是稳定的。一个排序是稳定的,如果它保证不改变比较相等的元素的相对顺序

如果您想按整数的值排序,如果两次出现相同,您可以扩展排序函数以返回一个元组,例如:

lst = sorted(l, key=lambda x: (-c[x], x))
# lst: [0, 0, 0, 5, 5, 5, 1, 1, 2, 3, 4, 33]
于 2021-02-28T10:14:44.670 回答