集合的计数器是否保持数据排序?

问题描述 投票:0回答:2

我正在阅读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

python counter
2个回答
8
投票

就存储在

Counter
对象中的数据而言:从 Python 3.7 开始,数据是按插入顺序排列的,因为
Counter
是内置
dict
的子类。 在 Python 3.7 之前,没有保证数据的顺序。

但是,您所看到的行为来自

Counter.__repr__
。 从源代码我们可以看到,它会首先尝试使用
Counter.most_common
方法来显示,该方法按值降序排序。 如果由于值不可排序而失败,它将回退到
dict
表示形式,这又是按插入顺序排列的。


3
投票

顺序取决于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}
© www.soinside.com 2019 - 2024. All rights reserved.