วิธีรับค่าสุ่มจากพจนานุกรมในไพ ธ อน


149

ฉันจะสุ่มจับคู่จาก a ได้dictอย่างไร? ฉันกำลังสร้างเกมที่คุณต้องเดาเมืองหลวงของประเทศและฉันต้องการคำถามให้ปรากฏแบบสุ่ม

dictดูเหมือน{'VENEZUELA':'CARACAS'}

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


260

วิธีหนึ่งจะเป็น:

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

แก้ไข : คำถามถูกเปลี่ยนไปสองสามปีหลังจากโพสต์ต้นฉบับและตอนนี้ขอคู่แทนที่จะเป็นรายการเดียว บรรทัดสุดท้ายควรเป็น:

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

141
สิ่งนี้จะทำงานใน Python 2.x โดยที่d.keys()เป็นรายการ แต่จะไม่ทำงานใน Python 3.x ซึ่งd.keys()เป็นตัววนซ้ำ คุณควรทำrandom.choice(list(d.keys()))แทน
ดันแคน

21
@Duncan: ฉันไม่สามารถรอจนกว่าห้องสมุดของบุคคลที่สามทั้งหมดจะเข้ากันได้กับ Python 3.x ดังนั้นคำถาม Python ก็ไม่จำเป็นต้องมีคำตอบ 2 ข้อสำหรับทุกคำถาม
Gerrat

9
รู้d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
มั้

4
@gentimouton ... น่าสนใจ แต่บางทีฉันอาจจะไปในเมืองที่มีประชากรมากที่สุดในแต่ละประเทศ - ไม่ใช่เมืองหลวง :)
Gerrat

12
มันมีประสิทธิภาพไหม? สเกลนี้ถ้า dict ใหญ่ขึ้นจริงหรือ?
Spectral


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คุณได้รับสินค้าในการสั่งซื้อ (แต่ไม่สุ่มสุ่ม) โดยพลการ

นอกจากนี้ยังเก็บไว้ในใจว่าpopitemเอาคู่ค่าคีย์จากพจนานุกรมตามที่ระบุไว้ในเอกสาร

popitem () มีประโยชน์ในการย้ำซ้ำในพจนานุกรม


29
สิ่งนี้เป็นสิ่งที่ไม่ดีเพราะถ้าคุณโหลดพจนานุกรมในลำดับเดียวกันกับงูหลามรุ่นเดียวกันคุณจะได้รับรายการเดียวกัน
อเล็กซ์


31
หลาม 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'

โดยการเรียกเลขสุ่มเลือกในkeysพจนานุกรม (ประเทศ)


2
สวัสดีฉันพยายามใช้วิธีการของคุณในการสุ่มเลือกหนึ่งคีย์จากพจนานุกรมที่กำหนด แต่ไม่ได้ผล พจนานุกรมของฉันดูเหมือน = {'walk': 20, 'run': 80} และเมื่อฉันใช้ random.choice (a.keys ()) มีข้อผิดพลาดเช่นวัตถุ "dict_keys" ไม่สนับสนุนการจัดทำดัชนี " คุณรู้หรือไม่ว่ามีอะไรผิดปกติ? ขอบคุณมาก!!!
beepretty

7
@beepretty dict.keys () ส่งคืนออบเจกต์ที่ซ้ำได้ random.choice(list(d.keys()))เพื่อแก้ไขข้อผิดพลาดการใช้งาน
Greenstick

3
ใช้ random.sample แทนซึ่งถูกกว่าการคัดลอกคีย์ไปยังรายการ
steveayre

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

(สไตล์หลาม 3)


3

ตั้งแต่นี้เป็นการบ้าน:

ตรวจสอบrandom.sample()ที่จะเลือกและกลับองค์ประกอบสุ่มจากรายการ คุณสามารถได้รับรายชื่อของคีย์พจนานุกรมด้วยและรายการค่าพจนานุกรมด้วยdict.keys()dict.values()


5
random.sampleและrandom.choiceไม่สามารถทำงานกับตัววนซ้ำได้ พวกเขาจำเป็นต้องทราบความยาวของลำดับซึ่งไม่สามารถหาได้จากตัววนซ้ำ
AFoglia

10
ไม่นี่ไม่ใช่การบ้านฉันเขียนเพื่อช่วยฉันด้วยภาษาสเปน
tekknolagi

3
random.sampleผลตอบแทนที่ได้kสุ่มองค์ประกอบ , random.choiceผลตอบแทนที่เป็นองค์ประกอบสุ่มเดียว
Anentropic

ใช่ ... ไม่เจ๋งที่จะคิดว่านี่เป็นปัญหาการบ้าน สิ่งที่บอกว่าทำเพื่อชุมชน?
jvriesem

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)จากนั้นเอาต์พุตจะเป็นดังนี้:

เวเนซุเอลา? CARACAS
แคนาดา? โตรอนโต

คุณสามารถขยายเพิ่มเติมได้อีกด้วยการสับตัวเลือกด้วย


คุณไม่ควรเขียนโปรแกรมโดยไม่เปลี่ยนเช่นนี้ ลองนึกภาพวาดที่ 100 ของ 100 องค์ประกอบ - มีโอกาส 99% selected_keysที่จะตีภายในองค์ประกอบของ และคุณอาจจะทำซ้ำประมาณ 100 ครั้ง อย่างน้อยก็ลบคีย์ที่ถ่ายของ q like del(q[current_selection])- คุณสามารถเขียนทับ q ด้วย shuffled ใหม่selected_keysเหมือนq = selected_keysทุกอย่าง อย่าลืมระบุด้วย! หรือดูnp.random.choice(...)วิธีการของฉัน: stackoverflow.com/a/62843377/4575793
Cadoiz


1

กับรุ่นที่ทันสมัยของงูใหญ่ (ตั้งแต่ 3) วัตถุที่ส่งกลับโดยวิธีการdict.keys(), dict.values()และdict.items()มีมุมมองที่วัตถุ * และสามารถทำซ้ำได้ดังนั้นการใช้โดยตรงrandom.choiceจึงเป็นไปไม่ได้เนื่องจากตอนนี้พวกมันไม่ใช่รายการหรือชุด

ทางเลือกหนึ่งคือการใช้ list comprehension เพื่อทำงานด้วย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

ฉันพบโพสต์นี้โดยมองหาโซลูชันที่เปรียบเทียบกันได้ สำหรับการเลือกหลายองค์ประกอบจาก dict สามารถใช้สิ่งนี้ได้:

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.