我正在尝试按其元素的频率对列表进行排序。
>>> 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()
?
您看到的是的某些CPython实现细节的结果list.sort
。再试一次,但是先创建一个副本a
:
a.sort(key=a.copy().count)
a
# [1, 5, 5, 2, 2, 4, 4, 4]
.sort
在a
内部进行修改,因此a.count
将产生无法预测的结果。这被记录为实现细节。
什么copy
电话确实是它创建的副本a
用途和该列表的count
的关键方法。您可以看到一些调试语句会发生什么:
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]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句