频率排序问题python sorted()没有给出我想要的结果

2024-09-28 23:07:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的代码:

def frequency_sorting(numbers):
    return sorted(numbers, key=lambda i:numbers.count(i),reverse=True)

或者:

def frequency_sorting(numbers):
    return sorted(numbers, key=numbers.count,reverse=True)

当我打电话时:

frequency_sorting([3,4,11,13,11,4,4,7,3])

两者都给我:

[4, 4, 4, 3, 11, 11, 3, 13, 7]

我希望:

[4, 4, 4, 3, 3, 11, 11, 13, 7]

我知道如何解决最初的想法。我只需要从理论上理解为什么我的代码不能工作。你知道吗


Tags: lambdakey代码truereturndefcount理论
2条回答

排序是guaranteed to be stable,这意味着如果某些项具有相同的键值,则保留它们的原始顺序。你知道吗

更容易看到字符串发生了什么,没有相反的顺序:

list(sorted(['zzz', 'aa', 'cc', 'bb', 'bbb', 'aaa'], key=len))
# ['aa', 'cc', 'bb', 'zzz', 'bbb', 'aaa']

所有长度为2的字符串首先按其原始顺序排列,然后所有长度为3的字符串也按其原始顺序排列。你知道吗

在代码中,计数为2的值依次为3、11、11和3。因此,排序后它们将按此顺序排列(按您的要求反转,但看起来是一样的)。你知道吗

如果要先按计数,然后按值(而不是按原始顺序)排序,则必须使用以下命令使其显式:

def frequency_sorting(numbers):
    return sorted(numbers, key=lambda i:(numbers.count(i), -i), reverse=True)

您的代码不起作用,因为11和3(在您的示例中)具有相同的计数;排序的优先级相同。你知道吗

所以3, 11是一个有序的序列,就像11, 33, 3, 11, 113, 11, 3, 11一样,所有这些都是正确的,选择取决于算法的实现方式。你知道吗

因此,您需要指定顺序的键不仅是相等元素的数目,而且是相等元素的数目(具有更高的重要性)和元素本身(如果您需要的话)。因此,如果您想要相等元素数的倒序和(然后)元素值的顺序,您可以使用:

sorted(numbers, key=lambda i:(-numbers.count(i),i))

或者同等地

sorted(numbers, key=lambda i:(numbers.count(i),-i),reverse=True)

您可能希望按元素的数量和(然后)元素的第一次出现来排序,在这种情况下,您可以使用:

sorted(numbers, key=lambda i:(-numbers.count(i),numbers.index(i)))

或者可以使用其他方法;这取决于您希望如何对计数相同但值不同的元素进行排序

相关问题 更多 >