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

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

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

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

Q&A

解決済

3回答

1096閲覧

ハッシュのキーをランダムで取得したい

program777

総合スコア7

Python

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

0グッド

0クリップ

投稿2021/06/18 00:49

【問題点】
ハッシュにキーとバリューを格納した後、そのキーと共にバリューを表示する際に、
ハッシュに格納された順番で表示されてしまう。

【解決したいこと】
ハッシュに格納されたキーとバリューを順不同(格納された順番ではなく)で表示したい。

【追記】

python

1for key in hash.keys() 2 print(key + " " +hash[key])

私の見解だと、ハッシュを用いてキーと共に対応するバリューを格納し、
上記のような形でキーを取得(特に〇〇.keys())を行い、出力する際は順不同で出力されるものなのかと考えていますが、その考え方がそもそも違うのでしょうか?
もし違うのであれば、ハッシュの中身を順不同(ランダム)で出力したいのですが、どうすれば良いでしょうか...

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

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

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

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

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

guest

回答3

0

Python3.6までは辞書の順序は保存されませんでしたが、3.7以降では入れた順が保存されます。

また、「順不同」と、「ランダム」を混同していませんか?
ランダムが欲しいなら自分でランダムに並べ替えが必要です。

順不同というのは、順序について何も保証されない、何の期待もしてはいけないと言うことです。
処理系の都合で決めるので、どんな順序になってもよいようにプログラミングを書けと言うこと。

投稿2021/06/18 02:03

編集2021/06/18 02:11
otn

総合スコア84566

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

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

program777

2021/06/18 05:09

ご回答ありがとうございます。 順不同とランダムの違いについてきちんと理解できていませんでした。 勉強になりました。
otn

2021/06/18 13:04

3.7からじゃなくて3.6の途中からのようです。
guest

0

ベストアンサー

  • ハッシュに格納されているキーの数が10万以上あるためか、リストに格納できずエラーが起きてしまいます。

これが正しいかどうかは、以下のコードを見て考えてください。

python

1>>> hash = {'a':0, 'b': 1} 2>>> 3>>> list=[] #キーをシャッフルするためにリストに格納 4>>> num=0 #リストの要素番号 5>>> for key in hash.keys(): 6... list[num] = key 7... num += 1 8... 9Traceback (most recent call last): 10 File "<stdin>", line 2, in <module> 11IndexError: list assignment index out of range
  • そもそもlistに上限があるのでしょうか?

当然あります。なぜならば、コンピュータのメモリは有限だからです。

こういうのは、手本を見て覚える方が速いでしょう。

python

1>>> hash = {'a':0, 'b': 1} 2>>> key_list = list(hash.keys()) 3>>> print(key_list) 4['a', 'b']

listという名前は組込みクラスの名前なので、変数として使うと後で困ることが多いのでやめましょう。

投稿2021/06/18 06:24

ppaul

総合スコア24666

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

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

program777

2021/06/20 04:31

ご回答ありがとうございます。 key_list = list(hash.keys()) print(key_list) を使用して、シャッフルを試みたら、無事実行できました。 ありがとうございました!
guest

0

出力する際は順不同で出力されるものなのかと考えていますが、その考え方がそもそも違うのでしょうか?

はい、Pythonの辞書は順序を保存しますPython3公式)。

あえて順不同としたい場合には、自分でシャッフルするなどをやるしかありません。

投稿2021/06/18 01:12

maisumakun

総合スコア145184

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

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

program777

2021/06/18 02:54

ご回答ありがとうございます。 アドバイスいただいた通り、キーをシャッフルをして出力を試みました。 下記のような形で実行してみましたが、エラーがでて出力できませんでした。 ハッシュのキーはこのような形でshuffleを行うことはできないのでしょうか? 【コード】 import random ・・・ random.shuffle(hash.keys()) 【エラー】 random.shuffle(hash.keys()) x[i], x[j] = x[j], x[i] TypeError: 'dict_keys' object is not subscriptable
maisumakun

2021/06/18 02:58

> ハッシュのキーはこのような形でshuffleを行うことはできないのでしょうか? はい。hash.keys()の結果は直接書き換えることはできません。
program777

2021/06/18 05:23

ご回答ありがとうございます。 そうなんですね...。 ハッシュのキーをシャッフルするために、その他の方法として、いったん、キーを全てリストに格納し、shuffleを行うことを考えました。 しかし、ハッシュに格納されているキーの数が10万以上あるためか、リストに格納できずエラーが起きてしまいます。 【コード】 list=[] #キーをシャッフルするためにリストに格納 num=0 #リストの要素番号 for key in hash.keys(): list[num] = key num += 1 random.shuffle(list) 【エラー】 IndexError: list index out of range 【追記】 そもそもlistに上限があるのでしょうか? 〇上限がある場合 キーの数が多すぎて溢れてしまっている可能性を考える 〇データ数に上限があったとしても相当数あるor上限なし コードが間違っている可能性を考える、(要素数のデータ型など) 上記のような形でエラーの原因を考えています。 アドバイスいただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問