পাইথনে অভিধান থেকে একটি এলোমেলো মান কীভাবে পাবেন


148

আমি কীভাবে এ থেকে এলোমেলো জোড় পেতে পারি dict? আমি এমন একটি গেম তৈরি করছি যেখানে আপনাকে কোনও দেশের রাজধানী অনুমান করা দরকার এবং এলোমেলোভাবে উপস্থিত হওয়ার জন্য আমার প্রশ্নগুলির দরকার।

dictদেখে মনে হচ্ছে{'VENEZUELA':'CARACAS'}

কিভাবে আমি এটি করতে পারব?

উত্তর:


259

একটি উপায় হবে:

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

সম্পাদনা : প্রশ্নটি মূল পোস্টের কয়েক বছর পরে পরিবর্তিত হয়েছিল এবং এখন একক আইটেমের পরিবর্তে একটি জোড় চেয়েছে। চূড়ান্ত লাইনটি এখন হওয়া উচিত:

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

141
এটি পাইথন ২.x যেখানে কাজ করবে সেখানে কাজ করবে d.keys()তবে এটি পাইথন ৩.x এ কাজ করবে না যেখানে d.keys()পুনরাবৃত্তি রয়েছে। random.choice(list(d.keys()))পরিবর্তে আপনার করা উচিত ।
ডানকান

21
@ ডানকান: তৃতীয় পক্ষের সমস্ত লাইব্রেরি পাইথন ৩.x উপযুক্ত না হওয়া পর্যন্ত আমি অপেক্ষা করতে পারি না, সুতরাং পাইথন প্রশ্নের প্রতিটি প্রশ্নের জন্য ২ টি উত্তরের প্রয়োজন নেই।
জেরাত

9
এরার কীভাবে: d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
হি

4
@ জেনিটিম্যাটন ... আকর্ষণীয়, তবে সম্ভবত আমি প্রতিটি দেশের সর্বাধিক জনবহুল শহরের জন্য
যাচ্ছিলাম

12
এটা কি দক্ষ? এই স্কেল যদি ডিকটি সত্যই বড় হয়?
বর্ণালী

26

আমি একই সমস্যাটি সমাধান করার চেষ্টা করে এটি লিখেছিলাম:

https://github.com/robtandy/randomdict

এটিতে কী (মান) এবং আইটেমগুলিতে ও (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হিসাবে বলেছেন, অভিধান থেকে কী-মান জোড়া সরিয়ে ফেলা হবে ডক্স

পপাইটেম () কোনও অভিধানে ধ্বংসাত্মকভাবে পুনরাবৃত্তি করতে দরকারী


29
এটি একধরণের খারাপ, কারণ অজগরটির একই সংস্করণে যদি আপনি একই ক্রমে অভিধানটি লোড করেন তবে আপনি প্রায় একই আইটেমটি পাবেন।
অ্যালেক্স


31
অজগর 3.6 ডিক আসলে অর্ডার করা হয় ! এটি অত্যন্ত গুরুত্বপূর্ণ
বা ডুয়ান

7
এই উত্তরটি ঠিক ভুল। এমনকি 6.6 এর আগে এটি আপনাকে এলোমেলো মান দেয় না, তবে আইটেমটির ওপরে হ্যাশ মানের উপর নির্ভর করে একটি মান।
ওবু

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'

অভিধানের (দেশগুলি) এ র্যান্ডম.চয়েস কল করে keys


2
হাই, আমি কোনও প্রদত্ত অভিধান থেকে এলোমেলোভাবে একটি কী বাছতে আপনার পদ্ধতিটি ব্যবহার করার চেষ্টা করি, তবে এটি কার্যকর হয় না। আমার অভিধানটি একটি = walk 'ওয়াক': 20, 'রান': 80} এর মতো দেখায় এবং যখন আমি র্যান্ডম.চয়েস (a.keys ()) ব্যবহার করি তখন "ডিক_কিজ 'অবজেক্ট ইনডেক্সিং সমর্থন করে না" এর মতো একটি ত্রুটি রয়েছে। তুমি কি জানো ভুল কি? অনেক ধন্যবাদ!!!
বিপ্রেটি

7
@ বিপ্রেটি ডিক.কিজ () কোনও পুনরাবৃত্তযোগ্য অবজেক্ট ফিরিয়ে দেয়, তালিকার মতো বস্তু নয়। ত্রুটিটি সমাধান করতে, ব্যবহার করুন random.choice(list(d.keys()))
গ্রিনস্টিক

3
পরিবর্তে এলোমেলো নমুনা ব্যবহার করুন, যা তালিকায় কীগুলি অনুলিপি করার চেয়ে সস্তা।
স্টিভায়রে

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
না এটি হোমওয়ার্ক নয় আমি স্প্যানিশ সম্পর্কে আমাকে সাহায্য করার জন্য এটি লিখছি।
tekknolagi

3
random.sampleফেরৎ kর্যান্ডম উপাদান , random.choiceআয় একটি একক র্যান্ডম উপাদান
Anentropic

হ্যাঁ ... এটি গৃহকর্মের সমস্যা বলে ধরে নিতে কখনই শীতল হন না। সম্প্রদায়টির জন্য এটি কী বলে?
jvriesem

3

আমি ধরে নিচ্ছি যে আপনি একটি কুইজ ধরণের আবেদন করছেন making এই জাতীয় প্রয়োগের জন্য আমি একটি ফাংশন লিখেছি যা নীচে রয়েছে:

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 তম আঁকার কল্পনা করুন - এর মধ্যে কোনও উপাদানকে আঘাত করার 99% সুযোগ selected_keys। এবং আপনি সম্ভবত এটি প্রায় 100 বার পুনরাবৃত্তি করবেন। কমপক্ষে কিউ-এর নেওয়া কীগুলি মুছুন del(q[current_selection])- আপনি কি সব কিছুর selected_keysমতো নতুন শিফলেড দিয়ে কি ওভাররাইট করতে পারেন q = selected_keys। এছাড়াও পরিচয় সম্পর্কে ভুলবেন না! বিকল্পভাবে আমার তাকান np.random.choice(...): পদ্ধতির stackoverflow.com/a/62843377/4575793
Cadoiz

1

এটি চেষ্টা করুন (আইটেম থেকে র্যান্ডম.চয়েস ব্যবহার করে)

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()* দৃশ্য বস্তু। আরে পুনরাবৃত্তি করা যেতে পারে, সুতরাং সরাসরি ব্যবহার করা 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]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.