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() 视图被排序?