Python のcollectionsモジュールの Counter() は順序付けされていないコンテナーですが、同じサイズの整数からビルドすると、values() ビューは、Counter が最初にキーで並べ替えられたかのように表示されます。これは、私のコンピューター (3.4.3rc1) と、3.5 までのバージョンの Python を使用するオンライン 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
これは、要素が更新された場合は常に true であるとは限らず、他の型や整数サイズが混在している場合は false です。
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() ビューがソートされていると安全に想定できるのは、どのような制約の下ですか?