55987


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

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

[code]

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

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

[code]

    s = set()
    s.add(1)
    s.add(2)
    s.add(3)
    print(s) # {1, 2, 3}
    
[/code]

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

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


CC BY-SA 4.0
2019-06-21T13:07:56.793
55986
2019-06-21T13:49:48.720
34413
question
python python3
Pythonのset(集合)の表示順序について


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

「たまたま」です。

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

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

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

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

[code]

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

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


CC BY-SA 4.0
2019-06-21T13:29:34.817
55987
2019-06-21T13:49:48.720
2019-06-21T13:49:48.720
13972
13972
55986
answer