Python'da sözlükten rastgele bir değer nasıl elde edilir


149

Nasıl rastgele bir çifti alabilirim dict? Bir ülkenin başkentini tahmin etmeniz gereken bir oyun yapıyorum ve rastgele görünmek için sorulara ihtiyacım var.

dictoluşacağı{'VENEZUELA':'CARACAS'}

Bunu nasıl yapabilirim?

Yanıtlar:


260

Bunun bir yolu:

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

DÜZENLEME : Soru, orijinal gönderiden birkaç yıl sonra değiştirildi ve şimdi tek bir öğe yerine bir çift istiyor. Son satır şu şekilde olmalıdır:

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

141
Bu d.keys(), bir listenin bulunduğu Python 2.x'te çalışacaktır , ancak d.keys()bir yineleyici olan Python 3.x'de çalışmaz . Bunun random.choice(list(d.keys()))yerine yapmalısınız .
Duncan

21
@Duncan: Tüm üçüncü taraf kütüphaneleri Python 3.x uyumlu olana kadar bekleyemem, bu yüzden Python soruları her soru için 2 cevaba ihtiyaç duymaz.
Gerrat

9
Err nasıl olur: d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}Hehe, çok ince beyin yıkama için +1 ...
gentimouton

4
@gentimouton ... ilginç, ama belki de her ülkenin en kalabalık şehrine gidiyordum - başkentleri değil :)
Gerrat

12
Bu verimli mi? Dict gerçekten büyürse bu ölçek midir?
Spectral


14

Bunu dene:

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

Bu kesinlikle işe yarıyor.


12

randomModülü kullanmak istemiyorsanız popitem () işlevini de deneyebilirsiniz :

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

Yana dict korumaz sırayla kullanarak popitemondan keyfi öğeleri (ancak kesinlikle rastgele) sipariş olsun.

Ayrıca popitem, dokümanlarda belirtildiği gibi anahtar / değer çiftini sözlükten kaldıracağını unutmayın .

popitem () sözlük üzerinde yıkıcı bir şekilde yineleme yapmak için kullanışlıdır


29
Bu bir tür kötüdür, çünkü sözlüğü aynı python sürümünde aynı sırada yüklerseniz neredeyse aynı öğeyi alırsınız.
Alex


31
python 3.6 dict aslında SİPARİŞ EDİLDİ ! Bu çok önemli
Veya Duan

7
Bu cevap yanlış. 3.6'dan önce bile bu size rastgele bir değer vermez, ancak öğenin hash değerine bağlı bir değer verir.
OBu

1
OP'nin isteğiyle uyuşmazlığı görmezden gelen bu yol next, bir eşleme olduğu için bir sözlükle çalışmayan gerçeği aşmanın iyi bir yoludur . (Buraya ilham almak için geldim ve hepsi buydu).
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'

Sözlüğün (ülkeler) üzerindeki random.choice öğesini çağırarak keys.


2
Merhaba, rasgele belirli bir sözlükten bir anahtar seçmek için yönteminizi kullanmaya çalışıyorum, ancak çalışmıyor. Sözlüğüm = {'walk': 20, 'run': 80} gibi görünüyor ve random.choice (a.keys ()) kullandığımda, "dict_keys 'nesnesi indekslemeyi desteklemiyor" gibi bir hata var. Neyin yanlış olduğunu biliyor musun? Çok teşekkürler!!!
beepretty

7
@beepretty dict.keys () liste benzeri bir nesne değil, yinelenebilir bir nesne döndürür. Hatayı gidermek için kullanın random.choice(list(d.keys())).
Greenstick

3
Bunun yerine, tuşları bir listeye kopyalamaktan daha ucuz olan random.sample kullanın.
steveayre

7

Bu Python 2 ve Python 3'te çalışır:

Rastgele bir anahtar:

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

Rastgele bir değer

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

Rastgele bir anahtar ve değer

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

4

Random.choice () kullanmak istemiyorsanız, şu şekilde deneyebilirsiniz:

>>> 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'

Dikkat: list(…)burada birden çok kez oluşturursunuz. Nasıl myDictionary_list = list(myDictionary)?
Cadoiz

4

Orijinal gönderi çifti istediğinden :

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

(python 3 stili)


3

Bu ödev olduğu için:

random.sample()Hangisinin listeden rastgele bir öğe seçip döndüreceğini kontrol edin . İle sözlük anahtarlarının dict.keys()bir listesini ve ile sözlük değerlerinin bir listesini alabilirsiniz dict.values().


5
random.sampleve random.choiceyineleyicilerle çalışamaz. Bir yineleyiciden belirlenemeyen dizinin uzunluğunu bilmeleri gerekir.
AFoglia

10
hayır bu Ödev DEĞİL ispanyolca bana yardım etmek için yazıyorum.
tekknolagi

3
random.sampledöner krastgele elemanları , random.choicedöner tek bir rastgele eleman
Anentropic

Evet ... bunun bir ev ödevi problemi olduđunu varsaymak için asla harika. Bunu söylemek toplum için ne yapar?
jvriesem

3

Quiz türünde bir başvuru yaptığınızı varsayıyorum. Bu tür bir uygulama için aşağıdaki gibi bir fonksiyon yazdım:

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]))

Eğer questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}fonksiyonun girişini verir ve çağırırsam shuffle(questions)Çıkış aşağıdaki gibi olur:

VENEZUELA? CARACAS
KANADA? TORONTO

Seçenekleri de karıştırarak bunu daha da genişletebilirsiniz


Bu şekilde değiştirmeden çizimi programlamamalısınız. 100 öğeden 100'ünü çizdiğinizi düşünün - içinde bir öğeye% 99 şans selected_keys. Ve bunu yaklaşık 100 kez tekrar edeceksiniz. En azından q gibi alınan anahtarları silin del(q[current_selection])- selected_keystıpkı q = selected_keysher şeyden sonra olduğu gibi yeni karıştırılmış olarak q'nun üzerine yazabilirsiniz . Ayrıca tanımlama hakkında unutma! Alternatif olarak np.random.choice(...)yaklaşımıma bakın: stackoverflow.com/a/62843377/4575793
Cadoiz

1

Bunu deneyin (öğelerden random.choice kullanarak)

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

(3 beri) Python modern versiyonları ile yöntemlerle dönen nesnelerin dict.keys(), dict.values()ve dict.items()* görünümü nesneleri vardır. Ve yin yinelenebilir, bu yüzden random.choiceşimdi bir liste veya küme olmadığı için doğrudan kullanmak mümkün değildir.

Seçeneklerden biri, işi yapmak için liste kavrayışını kullanmaktır 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}')

Referanslar:


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'a hoş geldiniz! Kısa süreli sınırlı yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Uygun bir açıklama , bunun neden problem için iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Toby Speight

0

Bu yazıyı oldukça benzer bir çözüm arayarak buldum. Bir diksiyondan birden fazla öğe seçmek için bu kullanılabilir:

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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.