按列表中元素出现的次数对列表进行排序[重复]
-
这是有意设计的。当列表被适当排序时,CPython暂时“禁止”访问列表,该行为在此处记录:
CPython实现细节: 在对列表进行排序时,尝试使列表变异甚至检查的效果是不确定的。
Python的C实现使列表在整个持续时间内显示为空,并在可以检测到列表在排序过程中发生突变的情况下引发ValueError。您可以通过
A
在键功能内部进行打印来检查它-您将得到一个 空列表 :In [2]: def key_function(x): ...: print(A, x) ...: return A.count(x) ...: In [3]: A.sort(key=key_function) ([], 2) ([], 1) ([], 3) ([], 4) ([], 2) ([], 2) ([], 3)
但是,如果您这样做是为了
sorted()
:In [4]: sorted(A, key=key_function) ([2, 1, 3, 4, 2, 2, 3], 2) ([2, 1, 3, 4, 2, 2, 3], 1) ([2, 1, 3, 4, 2, 2, 3], 3) ([2, 1, 3, 4, 2, 2, 3], 4) ([2, 1, 3, 4, 2, 2, 3], 2) ([2, 1, 3, 4, 2, 2, 3], 2) ([2, 1, 3, 4, 2, 2, 3], 3) Out[4]: [1, 4, 3, 3, 2, 2, 2]
它也记录在
sort()
实现中:/* The list is temporarily made empty, so that mutations performed * by comparison functions can't affect the slice of memory we're * sorting (allowing mutations during sorting is a core-dump * factory, since ob_item may change). */.