gpt4 book ai didi

python - 使用 list.count 就地使用 .sort() 对列表进行排序不起作用。为什么?

转载 作者:行者123 更新时间:2023-12-05 06:50:26 25 4
gpt4 key购买 nike

我正在尝试按元素出现的频率对列表进行排序。

>>> a = [5, 5, 4, 4, 4, 1, 2, 2]
>>> a.sort(key = a.count)
>>> a
[5, 5, 4, 4, 4, 1, 2, 2]

a 没有变化。然而:

>>> sorted(a, key = a.count)
[1, 5, 5, 2, 2, 4, 4, 4]

为什么这个方法对 .sort() 不起作用?

最佳答案

您看到的是list.sort 的某个CPython 实现细节 的结果。再试一次,但首先创建 a 的副本:

a.sort(key=a.copy().count)
a
# [1, 5, 5, 2, 2, 4, 4, 4]

.sort 在内部修改 a,因此 a.count 将产生不可预测的结果。这是 documented作为实现细节。

copy 调用的作用是创建 a 的副本,并使用 that 列表的 count 方法作为 key 。您可以看到一些调试语句会发生什么:

def count(x):
print(a)
return a.count(x)

a.sort(key=count)
[]
[]
[]
...

a.sort 中访问时显示为空列表,[].count(anything) 将是 0。这解释了为什么输出与输入相同 - 谓词都相同 (0)。

OTOH,sorted 创建了一个新列表,所以它没有这个问题。


如果你真的想按频率计数排序,惯用的方法是使用Counter:

from collections import Counter

a.sort(key=Counter(a).get)
a
# [1, 5, 5, 2, 2, 4, 4, 4]

关于python - 使用 list.count 就地使用 .sort() 对列表进行排序不起作用。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66388890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com