अजगर में शब्दकोश से यादृच्छिक मूल्य कैसे प्राप्त करें


148

मैं एक यादृच्छिक जोड़ी कैसे प्राप्त कर सकता हूं dict? मैं एक ऐसा खेल बना रहा हूँ जहाँ आपको किसी देश की राजधानी का अनुमान लगाने की आवश्यकता है और मुझे बेतरतीब ढंग से प्रदर्शित होने के लिए प्रश्नों की आवश्यकता है।

dictदिखेगा{'VENEZUELA':'CARACAS'}

मैं यह कैसे कर सकता हूँ?

जवाबों:


259

एक तरीका होगा:

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

EDIT : मूल पोस्ट के कुछ साल बाद सवाल बदल गया था, और अब एक आइटम के बजाय एक जोड़ी के लिए पूछता है। अंतिम पंक्ति अब होनी चाहिए:

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

141
वह पायथन 2.x में काम करेगा जहां d.keys()एक सूची है, लेकिन यह पायथन 3.x में काम नहीं करेगा जहां d.keys()एक पुनरावृत्त है। आपको random.choice(list(d.keys()))इसके बजाय करना चाहिए ।
डंकन

21
@ डंकन: मैं तब तक इंतजार नहीं कर सकता जब तक कि सभी 3 पार्टी लाइब्रेरी पाइथन 3.x संगत नहीं हैं, इसलिए पाइथन के सवालों को हर सवाल के 2 जवाब की जरूरत नहीं है।
गेरेट

9
कैसे के बारे में: d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
हे

4
@gentimouton ... दिलचस्प है, लेकिन शायद मैं सिर्फ प्रत्येक देश में सबसे अधिक आबादी वाले शहर के लिए जा रहा था - राजधानियों नहीं :)
Gerrat

12
क्या यह कुशल है? क्या यह पैमाना अगर बहुत बड़ा हो जाए?
स्पेक्ट्रल

26

मैंने इसी समस्या को हल करने की कोशिश करते हुए लिखा:

https://github.com/robtandy/randomdict

इसमें O (1) कीज़, वैल्यू और आइटम्स की रैंडम एक्सेस है।


19
यह आपके वास्तविक उत्तर को खोजने के लिए ओ (1) नहीं है
बेरी त्सकला

14

इसे इस्तेमाल करे:

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

यह निश्चित रूप से काम करता है।


12

यदि आप randomमॉड्यूल का उपयोग नहीं करना चाहते हैं , तो आप पोपटेम () भी आज़मा सकते हैं :

>> 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 वास्तव में है आदेश दिया ! यह सुपर महत्वपूर्ण है
या डुआन

7
यह उत्तर गलत है। 3.6 से पहले भी यह आपको एक यादृच्छिक मूल्य नहीं देगा, लेकिन हैश मूल्य ओ.टी. आइटम के आधार पर एक मूल्य।
OBu

1
ओपी के अनुरोध के साथ असंगति को नजरअंदाज करते हुए, यह इस तथ्य पर पहुंचने का एक अच्छा तरीका है कि nextयह एक शब्दकोश के साथ काम नहीं करता है क्योंकि यह मानचित्रण है। (मैं यहां प्रेरणा के लिए आया था और यह वह था)।
मट्टियो फेरला

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
नमस्ते, मैं किसी दिए गए शब्दकोश से एक कुंजी को बेतरतीब ढंग से चुनने के लिए आपकी विधि का उपयोग करने की कोशिश करता हूं, लेकिन यह काम नहीं करता है। मेरा शब्दकोश एक = {'वॉक': 20, 'रन': 80} जैसा दिखता है और जब मैं रैंडम.चॉइस (a.keys ()) का उपयोग करता हूं, तो एक त्रुटि होती है जैसे "dict_keys 'ऑब्जेक्ट इंडेक्सिंग का समर्थन नहीं करता है"। क्या आप जानते हैं कि क्या गलत है? बहुत बहुत धन्यवाद!!!
beepretty

7
@beepretty dict.keys () एक पुनरावृत्त वस्तु लौटाता है, सूची-जैसी वस्तु नहीं। त्रुटि को हल करने के लिए, का उपयोग करें random.choice(list(d.keys()))
ग्रीनस्टिक

3
इसके बजाय random.sample का उपयोग करें, जो किसी सूची की कुंजी कॉपी करने से सस्ता है।
स्टीवेयरे

7

यह पायथन 2 और पायथन 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)?
कैडिज़ जूल

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पुनरावृत्तियों के साथ काम नहीं कर सकते। उन्हें अनुक्रम की लंबाई जानने की आवश्यकता है, जो एक पुनरावृत्त से निर्धारित नहीं किया जा सकता है।
एफ़ोग्लिया

10
नहीं, यह होमवर्क नहीं है मैं इसे स्पेनिश के साथ मदद करने के लिए लिख रहा हूं।
टेकनकोलागी

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)तो आउटपुट निम्नानुसार होगा:

वेनेज़ुएला? कराकास
कनाडा? TORONTO

आप विकल्पों में फेरबदल करके इसे और आगे बढ़ा सकते हैं


आपको इस तरह के प्रतिस्थापन के बिना ड्राइंग को प्रोग्राम नहीं करना चाहिए। 100 तत्वों में से 100 वें ड्राइंग की कल्पना करें - अंदर एक तत्व को हिट करने का 99% मौका selected_keys। और आप लगभग 100 बार दोहराएंगे। कम से कम की तरह q का लिया कुंजियां हटाएं del(q[current_selection])- आप नए फेरबदल के साथ क्ष अधिलेखित कर सकते हैं selected_keys, जैसे q = selected_keysसब कुछ के बाद। पहचान के बारे में भी मत भूलना! वैकल्पिक रूप से मेरे 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

पायथन के आधुनिक संस्करणों (3 से) के साथ, ऑब्जेक्ट विधियों द्वारा वापस आ गए dict.keys(), dict.values()और dict.items()ऑब्जेक्ट ऑब्जेक्ट्स * हैं। और हे को iterated किया जा सकता है, इसलिए सीधे उपयोग करना random.choiceसंभव नहीं है क्योंकि अब वे एक सूची या सेट नहीं हैं।

एक विकल्प के साथ काम करने के लिए सूची समझ का उपयोग करना है 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
ढेर अतिप्रवाह में आपका स्वागत है! इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित अल्पकालिक सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके दीर्घकालिक मूल्य में बहुत सुधार करेगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
टोबी स्पाईट

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]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.