Pythonで辞書からランダムな値を取得する方法


148

からランダムなペアを取得するにはどうすればよいdictですか?私はあなたが国の首都を推測する必要があるゲームを作っていて、ランダムに現れる質問が必要です。

dictように見えます{'VENEZUELA':'CARACAS'}

これどうやってするの?

回答:


259

1つの方法は次のとおりです。

import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.values()))

編集:質問は元の投稿から数年後に変更され、単一のアイテムではなくペアを求めるようになりました。最終行は次のようになります。

country, capital = random.choice(list(d.items()))

141
d.keys()リストがであるPython 2.xでは機能しd.keys()ますが、イテレータであるPython 3.xでは機能しません。random.choice(list(d.keys()))代わりに行う必要があります。
ダンカン

21
@Duncan:すべてのサードパーティライブラリがPython 3.x互換になるまで待つことができないので、Pythonの質問はすべての質問に対して2つの回答を必要としません。
Gerrat、2011

9
Errについて:d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}Hehe、非常に微妙な洗脳のための+1 ...
gentimouton 14

4
@gentimouton ...興味深いですが、おそらく首都ではなく、各国で最も人口の多い都市を目指していたのでしょう:)
Gerrat

12
これは効率的ですか?dictが本当に大きくなると、このスケールになりますか?
スペクトル


14

これを試して:

import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]

これは間違いなく動作します。


12

randomモジュールを使用したくない場合は、popitem()を試すこともできます。

>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)

以来dict 順序を保持しない、使用することによってpopitem、あなたはそれから任意の(しかし厳密にランダムではない)の順序でアイテムを取得します。

docsにpopitem記載されているように、辞書からキーと値のペアが削除されることにも注意してください。

popitem()は、辞書を破壊的に反復するのに役立ちます


29
これは一種の悪いことです。同じバージョンのpythonで同じ順序で辞書をロードすると、ほぼ確実に同じアイテムが取得されるからです。
アレックス


31
python 3.6 dictは実際に注文されています!これは非常に重要です
またはDuan

7
この答えは間違っています。3.6より前でも、これはランダムな値を与えませんが、アイテムのハッシュ値に依存する値を与えます。
OBu

1
OPの要求との不一致を無視して、この方法nextは、マッピングであるためにディクショナリで機能しないという事実を回避するための良い方法です。(私はインスピレーションを得るためにここに来ました、そしてこれはそれでした)。
Matteo Ferla

9
>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'

辞書(国)のrandom.choiceを呼び出しkeysます。


2
こんにちは、私はあなたの方法を使用して、指定された辞書からランダムに1つのキーを選択しようとしますが、それは機能しません。私の辞書はa = {'walk':20、 'run':80}のように見え、random.choice(a.keys())を使用すると、「dict_keys 'オブジェクトはインデックス作成をサポートしていません」などのエラーが発生します。何が悪いのか知っていますか?どうもありがとう!!!
beepretty 2016年

7
@beepretty dict.keys()は、リストのようなオブジェクトではなく、反復可能なオブジェクトを返します。エラーを解決するには、を使用しますrandom.choice(list(d.keys()))
Greenstick 2017年

3
代わりにrandom.sampleを使用してください。これは、キーをリストにコピーするよりも安価です。
steveayre 2018

7

これはPython 2とPython 3で機能します。

ランダムキー:

random.choice(list(d.keys()))

ランダムな値

random.choice(list(d.values()))

ランダムなキーと値

random.choice(list(d.items()))

4

random.choice()を使用したくない場合は、次の方法を試すことができます。

>>> list(myDictionary)[i]
'VENEZUELA'
>>> myDictionary = {'VENEZUELA':'CARACAS', 'IRAN' : 'TEHRAN'}
>>> import random
>>> i = random.randint(0, len(myDictionary) - 1)
>>> myDictionary[list(myDictionary)[i]]
'TEHRAN'
>>> list(myDictionary)[i]
'IRAN'

注意:list(…)ここで複数回生成します。いかがmyDictionary_list = list(myDictionary)ですか?
Cadoiz

4

元の投稿はペアを望んでいたので:

import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}
country, capital = random.choice(list(d.items()))

(python 3スタイル)


3

これは宿題なので:

random.sample()リストからランダムな要素を選択して返すものを確認してください。で辞書キーdict.keys()のリストを、で辞書値のリストを取得できますdict.values()


5
random.sampleそして、random.choiceイテレータで動作することはできません。彼らはシーケンスの長さを知る必要がありますが、これはイテレータからは決定できません。
AFoglia

10
これは宿題ではありません。スペイン語の助けになるように書いています。
tekknolagi、2011

3
random.sample戻りkランダム要素random.choice単一のランダムな要素を返します
Anentropic

ええと...これが宿題の問題だと思い込むことは決してクールではありません。それはコミュニティにとって何と言っていますか?
jvriesem 2017年

3

あなたはクイズのようなアプリケーションをしていると思います。この種のアプリケーションでは、次のような関数を記述しました。

def shuffle(q):
"""
The input of the function will 
be the dictionary of the question
and answers. The output will
be a random question with answer
"""
selected_keys = []
i = 0
while i < len(q):
    current_selection = random.choice(q.keys())
    if current_selection not in selected_keys:
        selected_keys.append(current_selection)
        i = i+1
        print(current_selection+'? '+str(q[current_selection]))

入力を指定questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}して関数を呼び出すとshuffle(questions)、出力は次のようになります。

ベネズエラ?カラカス
カナダ?トロント

オプションをシャッフルすることでこれをさらに拡張できます


このように置き換えずに描画をプログラムすることはできません。100要素の100分の1を描画することを想像してみてください。99%の確率で内の要素にヒットしますselected_keys。そして、あなたはおそらくそれを約100回繰り返すでしょう。少なくともqの取得したキーを次のように削除しますdel(q[current_selection])- すべての後のselected_keysようq = selected_keysに新しいシャッフルでqを上書きできます。また、識別を忘れないでください!あるいは、私のnp.random.choice(...)アプローチを見てください:stackoverflow.com/a/62843377/4575793
Cadoiz

1

これを試してください(アイテムのrandom.choiceを使用して)

import random

a={ "str" : "sda" , "number" : 123, 55 : "num"}
random.choice(list(a.items()))
#  ('str', 'sda')
random.choice(list(a.items()))[1] # getting a value
#  'num'

1

最新バージョンのPython(3以降)では、メソッドdict.keys()dict.values()およびによって返されるdict.items()オブジェクトはビューオブジェクトです*。また、繰り返し処理random.choiceが可能なため、リストやセットではないため、直接使用することはできません。

1つのオプションは、リスト内包表記を使用して次のことを行うことですrandom.choice

import random

colors = {
    'purple': '#7A4198',
    'turquoise':'#9ACBC9',
    'orange': '#EF5C35',
    'blue': '#19457D',
    'green': '#5AF9B5',
    'red': ' #E04160',
    'yellow': '#F9F985'
}

color=random.choice([hex_color for color_value in colors.values()]

print(f'The new color is: {color}')

参照:


0
b = { 'video':0, 'music':23,"picture":12 } 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('picture', 12) 
random.choice(tuple(b.items())) ('video', 0) 

2
Stack Overflowへようこそ!このコードスニペットをありがとうございます。このコードスニペットは、短期間の限定的なヘルプを提供する場合があります。適切な説明は、なぜこれが問題の優れた解決策であるを示すことにより、長期的な価値を大幅に改善し、他の同様の質問を持つ将来の読者にとってさらに役立つでしょう。回答を編集して、仮定を含めて説明を追加してください。
Toby Speight

0

私はかなり似た解決策を探してこの投稿を見つけました。辞書から複数の要素を選択するには、これを使用できます。

idx_picks = np.random.choice(len(d), num_of_picks, replace=False) #(Don't pick the same element twice)
result = dict ()
c_keys = [d.keys()] #not so efficient - unfortunately .keys() returns a non-indexable object because dicts are unordered
for i in idx_picks:
    result[c_keys[i]] = d[i]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.