Pythonのset(集合)の表示順序について

投稿者: Anonymous

最近Pythonを学び始めた者です。初歩的なことかも知れませんが、調べても望むような答えが見つかりませんでしたので質問させていただければと思います。

set(集合)について、公式ドキュメントにもあるように「重複する要素をもたない、順序づけられていない要素の集まり」と認識していました。

s = set()
s.add("a")
s.add("b")
s.add("c")
print(s) # {'c', 'a', 'b'}や{'a', 'c', 'b'}など

実際、上記のようにprintした際の要素の表示順はランダムになるものだと思っていたのですが、

s = set()
s.add(1)
s.add(2)
s.add(3)
print(s) # {1, 2, 3}

このコードでは常に昇順で表示されます。

この理由はなんでしょうか。

解決

この理由はなんでしょうか。

「たまたま」です。

まず、ひとつ確認しておかなくてはいけないのは「順序づけられていない」と言うのと「printした際の要素の表示順はランダムになる」と言うのとは別だと言うことです。

Pythonがある要素をsetに保持する場合、その内部的な順序は「簡単に予測出来ない何らかの方法」で決まります。ランダムに決めるかどうかは「順序づけられていない」と言う言葉には含まれていません。

したがって、特定の要素(1,2,3)をsetに保持した後、printした際の表示順が「たまたま昇順」になることはいくらでもあり得ます。「何らかの方法」が非決定性の乱数かなんかに基づく挙動を示すなんて保証もありませんから、「たまたま」(その要素の組み合わせの場合には)「常に昇順で表示」されるように見えることもあるかもしれません。

こちらは「python set order」で出てきた記事の例:

s = set()
s.add(1)
s.add(2)
s.add(20)
s.add(6)
s.add(100)
print(s) # ->{1, 2, 100, 6, 20}

私が試したところ、上の例は昇順でも要素の追加順でもない順番で表示されました。別のバージョンの処理系であれば、別の順番になるかもしれません。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *