我有这样的代码:
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]
我知道如何解决最初的想法。我只需要从理论上理解为什么我的代码不能工作。你知道吗
排序是guaranteed to be stable,这意味着如果某些项具有相同的键值,则保留它们的原始顺序。你知道吗
更容易看到字符串发生了什么,没有相反的顺序:
所有长度为2的字符串首先按其原始顺序排列,然后所有长度为3的字符串也按其原始顺序排列。你知道吗
在代码中,计数为2的值依次为3、11、11和3。因此,排序后它们将按此顺序排列(按您的要求反转,但看起来是一样的)。你知道吗
如果要先按计数,然后按值(而不是按原始顺序)排序,则必须使用以下命令使其显式:
您的代码不起作用,因为11和3(在您的示例中)具有相同的计数;排序的优先级相同。你知道吗
所以
3, 11
是一个有序的序列,就像11, 3
或3, 3, 11, 11
或3, 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)))
或者可以使用其他方法;这取决于您希望如何对计数相同但值不同的元素进行排序
相关问题 更多 >
编程相关推荐