Cara mendapatkan nilai acak dari kamus dengan python

149

Bagaimana saya bisa mendapatkan pasangan acak dari a dict ? Saya membuat game di mana Anda perlu menebak ibukota suatu negara dan saya butuh pertanyaan untuk muncul secara acak.

The dicttampak seperti{'VENEZUELA':'CARACAS'}

Bagaimana saya bisa melakukan ini?

tekknolagi
sumber

Jawaban:

261

Salah satu caranya adalah:

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

EDIT : Pertanyaan diubah beberapa tahun setelah posting asli, dan sekarang meminta pasangan, daripada satu item. Baris terakhir seharusnya sekarang:

country, capital = random.choice(list(d.items()))
Gerrat
sumber
141
Itu akan bekerja di Python 2.x di mana d.keys()daftar, tetapi itu tidak akan bekerja di Python 3.x di mana d.keys()merupakan iterator. Anda seharusnya melakukannya random.choice(list(d.keys())).
Duncan
21
@Duncan: Saya tidak bisa menunggu sampai semua perpustakaan pihak ke-3 kompatibel dengan Python 3.x, jadi pertanyaan-pertanyaan Python tidak membutuhkan 2 jawaban untuk setiap pertanyaan.
Gerrat
9
Err bagaimana kalau: d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}Hehe, +1 untuk pencucian otak yang sangat halus ...
gentimouton
4
@ gentimouton ... menarik, tapi mungkin saya hanya pergi untuk kota terpadat di setiap negara - bukan ibukota :)
Gerrat
12
Apakah ini efisien? Apakah skala ini jika dict menjadi sangat besar?
Spectral
26

Saya menulis ini mencoba memecahkan masalah yang sama:

https://github.com/robtandy/randomdict

Ini memiliki O (1) akses acak ke kunci, nilai, dan item.

Rob T
sumber
19
itu bukan O (1) untuk menemukan jawaban Anda yang sebenarnya
Berry Tsakala
14

Coba ini:

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

Ini pasti berhasil.

lavee_singh
sumber
12

Jika Anda tidak ingin menggunakan randommodul, Anda juga dapat mencoba popitem () :

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

Karena dict tidak mempertahankan pesanan , dengan menggunakan popitemAnda mendapatkan item dalam urutan acak (tetapi tidak sepenuhnya acak) darinya.

Juga perlu diingat bahwa popitemmenghapus pasangan nilai kunci dari kamus, sebagaimana dinyatakan dalam dokumen .

popitem () berguna untuk mengulang secara destruktif melalui kamus

patriciasz
sumber
29
Ini agak buruk, karena jika Anda memuat kamus dalam urutan yang sama pada versi python yang sama, Anda hampir pasti akan mendapatkan item yang sama.
Alex
Lihat juga: stackoverflow.com/questions/10593651/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件
31
python 3.6 dict sebenarnya ORDERED ! Ini sangat penting
Atau Duan
7
Jawaban ini salah. Bahkan sebelum 3.6 ini tidak akan memberikan Anda nilai acak, tetapi nilai tergantung pada nilai hash dari item tersebut.
OBu
1
Mengabaikan ketidaksesuaian dengan permintaan OP, cara ini adalah cara yang baik untuk mengatasi fakta yang nexttidak berfungsi dengan kamus karena merupakan pemetaan. (Saya datang ke sini untuk inspirasi dan ini dia).
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'

Dengan memanggil random.choice pada keyskamus (negara).

pengguna225312
sumber
2
Hai, saya mencoba menggunakan metode Anda untuk secara acak memilih satu kunci dari kamus yang diberikan, tetapi tidak berhasil. Kamus saya terlihat seperti = {'walk': 20, 'run': 80} dan ketika saya menggunakan random.choice (a.keys ()), ada kesalahan seperti "objek dict_keys 'tidak mendukung pengindeksan". Apakah kamu tahu apa yang salah? Terima kasih banyak!!!
beepretty
7
@beepretty dict.keys () mengembalikan objek yang dapat diulang, bukan objek seperti daftar. Untuk mengatasi kesalahan, gunakan random.choice(list(d.keys())).
Greenstick
3
Sebagai gantinya, gunakan sampel acak, yang lebih murah daripada menyalin kunci ke daftar.
steveayre
7

Ini berfungsi dalam Python 2 dan Python 3:

Kunci acak:

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

Nilai acak

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

Kunci dan nilai acak

random.choice(list(d.items()))
firelynx
sumber
4

Jika Anda tidak ingin menggunakan random.choice () Anda dapat mencoba cara ini:

>>> 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'
Milad Mohammad Rezaei
sumber
Perhatikan: Anda menghasilkan list(…)beberapa kali di sini. Bagaimana dengan myDictionary_list = list(myDictionary)?
Cadoiz
4

Karena posting asli menginginkan pasangan :

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

(gaya python 3)

OBu
sumber
3

Karena ini adalah pekerjaan rumah:

Lihat random.sample()yang akan memilih dan mengembalikan elemen acak dari daftar. Anda bisa mendapatkan daftar kunci kamus dict.keys()dan daftar nilai kamus dict.values().

carl
sumber
5
random.sampledan random.choicetidak bisa bekerja dengan iterator. Mereka perlu mengetahui panjang urutan, yang tidak dapat ditentukan dari iterator.
AFoglia
10
tidak ini BUKAN pekerjaan rumah saya menulisnya untuk membantu saya dengan bahasa Spanyol.
tekknolagi
3
random.samplemengembalikan elemenk acak , mengembalikan elemen acak tunggalrandom.choice
Anentropic
Ya ... tidak pernah keren untuk menganggap ini adalah masalah pekerjaan rumah. Apa yang dikatakan pepatah bagi masyarakat?
jvriesem
3

Saya berasumsi bahwa Anda sedang membuat semacam aplikasi kuis. Untuk aplikasi semacam ini saya telah menulis fungsi yaitu sebagai berikut:

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

Jika saya akan memberi input questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}dan memanggil fungsishuffle(questions) maka outputnya adalah sebagai berikut:

VENEZUELA? CARACAS
KANADA? TORONTO

Anda dapat memperpanjang ini lebih jauh dengan mengocok opsi juga

Anivarth
sumber
Anda seharusnya tidak memprogram gambar tanpa penggantian seperti ini. Bayangkan menggambar elemen ke 100 dari 100 elemen - peluang 99% untuk mengenai elemen di dalamnya selected_keys. Dan Anda mungkin akan mengulanginya sekitar 100 kali. Setidaknya hapus kunci q seperti yang diambil del(q[current_selection])- Anda dapat menimpa q dengan yang baru dikocok selected_keysseperti q = selected_keyssemuanya. Juga jangan lupa tentang pengidentifikasian! Atau lihat np.random.choice(...)pendekatan saya : stackoverflow.com/a/62843377/4575793
Cadoiz
1

Coba ini (menggunakan pilihan acak dari item)

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'
Herman Yanush
sumber
1

Dengan versi Python modern (sejak 3), objek dikembalikan dengan metode dict.keys(), dict.values()dan dict.items()objek tampilan *. Dan hei dapat diulang, jadi menggunakan secara langsung random.choicetidak mungkin karena sekarang mereka bukan daftar atau set.

Salah satu opsi adalah menggunakan pemahaman daftar untuk melakukan pekerjaan dengan 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}')

Referensi:

Israel Z. DelaMora
sumber
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) 
ziya efkar
sumber
2
Selamat Datang di Stack Overflow! Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan jangka pendek terbatas. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan lain yang serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Toby Speight
0

Saya menemukan posting ini dengan mencari solusi yang agak sebanding. Untuk memilih beberapa elemen dari suatu dict, ini dapat digunakan:

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]
Cadoiz
sumber