Как получить доступ к значениям из словаря случайным образом в python3? [Дубликат]

Хотя маловероятно, что какие-либо компиляторы и процессоры действительно это сделают, было бы законно в соответствии со стандартом C для компилятора реализовать «i ++» с последовательностью:

In a single operation, read `i` and lock it to prevent access until further notice
Compute (1+read_value)
In a single operation, unlock `i` and store the computed value

Пока Я не думаю, что какие-либо процессоры поддерживают аппаратное обеспечение, позволяющее эффективно выполнять такую ​​работу, легко представить себе ситуации, когда такое поведение упростит многопоточный код (например, это гарантирует, что если два потока попытаются выполнить описанную выше последовательность одновременно i будет увеличиваться на два), и совершенно немыслимо, чтобы какой-то будущий процессор мог предоставить что-то подобное.

Если компилятор должен был написать i++, как указано выше (в соответствии с стандарт) и должны были интерпретировать приведенные выше инструкции в ходе оценки общего выражения (также законного), и если бы не было уведомления о том, что одна из других инструкций имела доступ к i, это было бы возможно (и юридический) для компилятора для генерации последовательности instr которые могли бы затормозить. Разумеется, компилятор почти наверняка обнаружит проблему в том случае, если в обоих местах используется одна и ту же переменная i, но если подпрограмма принимает ссылки на два указателя p и q и использует (*p) и (*q) в приведенном выше выражении (вместо того, чтобы дважды использовать i), компилятору не потребовалось бы распознавать или избегать тупиковой ситуации, которая произошла бы, если бы тот же адрес объекта был передан как для p, так и для q.

107
задан sashkello 15 May 2013 в 07:49
поделиться

11 ответов

Один из способов (в Python 2. *):

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

EDIT: вопрос был изменен через пару лет после исходного сообщения, и теперь запрашивает пару, а не одну пункт. Конечная строка должна быть следующей:

country, capital = random.choice(list(d.items()))
185
ответ дан Alexander Reynolds 29 August 2018 в 00:58
поделиться

Я предполагаю, что вы делаете викторину. Для такого приложения я написал функцию, которая выглядит следующим образом:

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
CANADA? TORONTO

Вы можете расширить это еще больше, перетасовывая параметры, и я надеюсь, что это поможет. Источник: РАДИУС КРУГА

3
ответ дан Anivarth 29 August 2018 в 00:58
поделиться

Поскольку это домашнее задание:

Проверьте random.sample() , который будет выбирать и возвращать случайный элемент из списка. Вы можете получить список ключей словаря с dict.keys() и список значений словаря с помощью dict.values().

4
ответ дан carl 29 August 2018 в 00:58
поделиться

Если вы не хотите использовать модуль 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 Параметр value из словаря, как указано в docs .

popitem () полезен для деструктивного итерации по словарю

15
ответ дан Community 29 August 2018 в 00:58
поделиться

Попробуйте это (используя random.choice from items)

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
ответ дан Herman Yanush 29 August 2018 в 00:58
поделиться

Попробуйте следующее:

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

Это определенно работает.

6
ответ дан lavee_singh 29 August 2018 в 00:58
поделиться

Если вы не хотите использовать 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'
4
ответ дан Milad Mohammad Rezaei 29 August 2018 в 00:58
поделиться

Поскольку исходная запись хотела пару:

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

(стиль python 3)

3
ответ дан OBu 29 August 2018 в 00:58
поделиться

Я написал это, пытаясь решить ту же проблему:

https://github.com/robtandy/randomdict

Он имеет O (1 ) произвольный доступ к ключам, значениям и элементам.

22
ответ дан Rob T 29 August 2018 в 00:58
поделиться
>>> 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 словаря (страны).

7
ответ дан user225312 29 August 2018 в 00:58
поделиться
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) 
1
ответ дан WhatsThePoint 29 August 2018 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: