Как я могу получить случайную пару от dict
? Я делаю игру, в которой вам нужно угадать столицу страны, и мне нужно, чтобы вопросы появлялись случайным образом.
В dict
смахивает{'VENEZUELA':'CARACAS'}
Как я могу это сделать?
Как я могу получить случайную пару от dict
? Я делаю игру, в которой вам нужно угадать столицу страны, и мне нужно, чтобы вопросы появлялись случайным образом.
В dict
смахивает{'VENEZUELA':'CARACAS'}
Как я могу это сделать?
Ответы:
Одним из способов будет:
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.values()))
РЕДАКТИРОВАТЬ : вопрос был изменен через пару лет после первоначального сообщения, и теперь просит пару, а не один элемент. Последняя строка теперь должна быть:
country, capital = random.choice(list(d.items()))
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
Хе-хе, +1 за очень тонкое промывание мозгов ...
Я написал это, пытаясь решить ту же проблему:
https://github.com/robtandy/randomdict
Он имеет O (1) произвольный доступ к ключам, значениям и элементам.
Попробуй это:
import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]
Это определенно работает.
Если вы не хотите использовать 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 () полезен для деструктивного перебора словаря
next
не работает со словарем, так как это отображение. (Я пришел сюда для вдохновения, и это было все).
>>> 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
словаре (страна).
random.choice(list(d.keys()))
.
Если вы не хотите использовать 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)
?
Так как это домашнее задание:
Проверьте, random.sample()
какой из них выберет и вернет случайный элемент из списка. Вы можете получить список ключей словаря с помощью dict.keys()
и список значений словаря с помощью dict.values()
.
random.sample
и random.choice
не может работать с итераторами. Им нужно знать длину последовательности, которую нельзя определить с помощью итератора.
random.sample
возвращает k
случайные элементы , random.choice
возвращает один случайный элемент
Я предполагаю, что вы подаете заявку на викторину. Для такого рода приложений я написал следующую функцию:
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)
то вывод будет следующим:
ВЕНЕСУЭЛА? КАРАКАС КАНАДА? ТОРОНТО
Вы можете расширить это еще больше, перетасовывая опции также
selected_keys
. И вы, вероятно, будете повторять это около 100 раз. По крайней мере удалите взятые ключи q like del(q[current_selection])
- вы можете перезаписать q новым shuffled, selected_keys
как q = selected_keys
после всего. Также не забывайте об идентификации! В качестве альтернативы посмотрите на мой np.random.choice(...)
подход: stackoverflow.com/a/62843377/4575793
Попробуйте это (используя 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'
В современных версиях 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}')
Ссылки:
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)
Я нашел этот пост, ища довольно сопоставимое решение. Для выбора нескольких элементов из условия, это может быть использовано:
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]
d.keys()
есть список, но не будет работать в Python 3.x, гдеd.keys()
есть итератор. Вы должны сделатьrandom.choice(list(d.keys()))
вместо этого.