首页 > 解决方案 > collections.Counter().values() 视图似乎在某些条件下按键排序。为什么以及它们是什么?

问题描述

Python集合模块中的 Counter() 是一个无序容器,但是当从相同大小的整数构建时,values() 视图看起来好像 Counter 首先按键排序。这在我的计算机 (3.4.3rc1) 以及 Python 版本不超过 3.5 的在线 IDE (tio.run, ideone.com) 上始终如一地发生;3.6+ 或 PyPy 并非如此。

from collections import Counter
import random

def counter_is_sorted(iterable):
    c = Counter(iterable)
    return list(c.values()) == [v for k, v in sorted(c.items())]

print(counter_is_sorted([random.randrange(1000) for _ in range(50000)]))

True

当元素被更新并且对于其他类型和混合整数大小为假时,这并不总是正确的:

print(counter_is_sorted([random.randrange(65000, 66000) for _ in range(50000)]))
print(counter_is_sorted([round(random.uniform(0, 10), 2) for _ in range(50000)]))
print(counter_is_sorted([random.choice("abcdefghijklmnopqrstuvwxyz") for _ in range(50000)]))

False
False
False

这是设计使然还是取决于某些特定因素?在什么约束下,我们可以安全地假设 values() 视图被排序?

标签: pythonpython-collections

解决方案


推荐阅读