Як отримати випадкове значення зі словника в python


149

Як я можу отримати випадкову пару від dict? Я роблю гру, де вам потрібно відгадати столицю країни, і мені потрібні питання, щоб з’являтися випадковим чином.

На dictвигляд{'VENEZUELA':'CARACAS'}

Як я можу це зробити?

Відповіді:


260

Один із способів:

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

EDIT : Питання було змінено через пару років після початкової публікації, і тепер він вимагає пари, а не одного пункту. Остаточним рядком має бути:

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 відповіді на кожне питання.
Геррат

9
Помилка, як щодо: d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}Хе-х, +1 для дуже тонкої промивання мізків ...
gentimouton

4
@gentimouton ... цікаво, але, можливо, я просто їхав за найнаселенішим містом у кожній країні - не за столицями :)
Геррат

12
Це ефективно? Чи є ця шкала, якщо дік стає дійсно великим?
Спектрал


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
Це щось погано, адже якщо ви завантажите словник у тому ж порядку на ту ж версію python, ви майже напевно отримаєте той самий елемент.
Олексій


31
python 3.6 dict насправді ЗАМОВЛЕНО ! Це дуже важливо
або Duan

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
Привіт, я намагаюся використовувати ваш метод, щоб випадковим чином вибрати один ключ із заданого словника, але це не працює. Мій словник виглядає як = {'walk': 20, 'run': 80}, і коли я використовую random.choice (a.keys ()), виникає помилка на зразок "dict_keys 'об'єкт не підтримує індексацію". Ви знаєте, що не так? Дуже дякую!!!
бджолаті

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)?
Кадоїс

4

Оскільки оригінальний пост хотів пари :

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

(стиль python 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) тоді вихід буде таким:

VENEZUELA? CARACAS
КАНАДА? ТОРОНТО

Ви можете продовжити це ще більше, переміщуючи параметри


Не слід програмувати малюнок без такої заміни. Уявіть, що малюєте 100-ту з 100 елементів - 99% шансу потрапити в елемент всередині selected_keys. І ви, ймовірно, повторите це приблизно 100 разів. Принаймні видаліть узяті клавіші q like del(q[current_selection])- ви можете перезаписати q новою перетасованою так 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

У сучасних версіях Python (з 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
Ласкаво просимо до переповнення стека! Дякуємо за цей фрагмент коду, який може надати деяку короткочасну допомогу. Правильне пояснення значно покращило б його довгострокове значення, показавши, чому це хороше рішення проблеми, та зробило б кориснішим майбутнім читачам інші подібні питання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
Toby Speight

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.