質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5911閲覧

setの順番が毎回変わる理由

nouken

総合スコア369

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2020/06/22 05:30

編集2020/06/22 05:30

A.py

PYTHON

1set_list = [ 2 set(["hello", "yes", "wow", "bye", "you", "I"]), 3 set(["please", "no", "yeah", "good", "he", "she"]), 4 set(["sad", "happy", "angry", "crying", "go", "home"]) 5] 6 7for s in set_list: 8 print(s) 9 print(next(iter(s)))

python A.pyを三回実行した時の出力

output

1{'yes', 'I', 'hello', 'wow', 'you', 'bye'} 2yes 3{'no', 'he', 'good', 'yeah', 'she', 'please'} 4no 5{'happy', 'home', 'angry', 'go', 'sad', 'crying'} 6happy 7 8 9{'hello', 'yes', 'wow', 'bye', 'you', 'I'} 10hello 11{'he', 'good', 'she', 'no', 'please', 'yeah'} 12he 13{'happy', 'angry', 'go', 'home', 'crying', 'sad'} 14happy 15 16 17{'yes', 'wow', 'bye', 'I', 'hello', 'you'} 18yes 19{'no', 'please', 'he', 'she', 'yeah', 'good'} 20no 21{'go', 'crying', 'happy', 'angry', 'home', 'sad'} 22go

実行する度に表示される要素の順番が変わる理由について知りたいです。

調べたこと・やってみたこと

https://stackoverflow.com/questions/12165200/order-of-unordered-python-sets
にあるように、pythonのsetの表示される順番は、メモリに保存されている順番であり、メモリへの保存は各要素をハッシュ化した後の下位bitを用いて行われているようです。

そのため、setを作る時に与えるlistの順番が変われば、setで表示される順番も変わりうるようです。
一方で、setを作る時に与えるlistの順番が同じなら、保存順も同じになるはずなのですが、上の例ではそうなっていません。

追加情報として、同じスクリプト内であったり、同じnotebook内で複数回実行した際には同じ結果が得られます。この辺りもヒントになると思うのですが、自分では解決できなかったのでご教授願います。

LouiS0616👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

起動する度に文字列のハッシュ値が変わっているのでは無いでしょうか。
次のコードを複数回実行してみて下さい。

Python

1print(hash('spam'))

手元の実行環境では、値が変わることを確認できました。

cmd

1>ver 2Microsoft Windows [Version 10.0.18363.900] 3>python --version 4Python 3.8.3 5 6>type hashtest.py 7for _ in range(3): 8 print(hash('spam')) 9 10>python hashtest.py 11-738151039978978926 12-738151039978978926 13-738151039978978926 14 15>python hashtest.py 16347061199509584100 17347061199509584100 18347061199509584100 19 20>python hashtest.py 218544783028387532850 228544783028387532850 238544783028387532850

バージョン 3.3 で変更: ハッシュのランダム化がデフォルトで有効になりました。

3. データモデル — Python 3.8.3 ドキュメント

投稿2020/06/22 05:38

編集2020/06/22 05:41
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nouken

2020/06/22 05:48

確かにプロセスが違えばハッシュが異なることが手元でも再現できました。勝手に、入力が同じならハッシュも同じと思い込んでいました...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問