我正在阅读Python Collections的Counter。它说如下:
>>> from collections import Counter
>>> Counter({'z': 9,'a':4, 'c':2, 'b':8, 'y':2, 'v':2})
Counter({'z': 9, 'b': 8, 'a': 4, 'c': 2, 'y': 2, 'v': 2})
不知何故,这些打印值按降序打印(9 > 8 > 4 > 2)。为什么会这样呢?
Counter
是否存储已排序的值?
PS:我使用的是 python 3.7.7
就存储在
Counter
对象中的数据而言:从 Python 3.7 开始,数据是按插入顺序排列的,因为 Counter
是内置 dict
的子类。 在 Python 3.7 之前,没有保证数据的顺序。
但是,您所看到的行为来自
Counter.__repr__
。 从源代码我们可以看到,它会首先尝试使用Counter.most_common
方法来显示,该方法按值降序排序。 如果由于值不可排序而失败,它将回退到 dict
表示形式,这又是按插入顺序排列的。
顺序取决于python版本。
对于蟒蛇< 3.7, there is no guaranteed order, since python 3.7 the order is that of insertion.
3.7版本更改:作为dict的子类,Counter继承了 能够记住插入顺序。计数器上的数学运算 物体也保持秩序。结果根据何时排序 元素首先在左操作数中遇到,然后按顺序遇到 在正确的操作数中遇到。
Python 3.8(3.8.10 [GCC 9.4.0])示例:
from collections import Counter
Counter({'z': 9,'a':4, 'c':2, 'b':8, 'y':2, 'v':2})
输出:
Counter({'z': 9, 'a': 4, 'c': 2, 'b': 8, 'y': 2, 'v': 2})
Counter
是否未按计数排序由于
__str__
中的Counter
返回most_common
,这不是一个可靠的检查订单的方法。
转换为
dict
,__str__
表示将是忠实的。
c = Counter({'z': 9,'a':4, 'c':2, 'b':8, 'y':2, 'v':2})
print(dict(c))
# {'z': 9, 'a': 4, 'c': 2, 'b': 8, 'y': 2, 'v': 2}