社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

频率排序问题python-sorted()没有给出我期望的结果

Kamal Valikhanov • 5 年前 • 1557 次点击  

我有这样的代码:

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]

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52512
文章 [ 2 ]  |  最新文章 5 年前
Thierry Lathuille
Reply   •   1 楼
Thierry Lathuille    6 年前

分类是 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)
Marco Zamboni
Reply   •   2 楼
Marco Zamboni    6 年前

您的代码无法工作,因为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)))

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