Хотя маловероятно, что какие-либо компиляторы и процессоры действительно это сделают, было бы законно в соответствии со стандартом 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
.
Один из способов (в Python 2. *):
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(d.keys())
EDIT: вопрос был изменен через пару лет после исходного сообщения, и теперь запрашивает пару, а не одну пункт. Конечная строка должна быть следующей:
country, capital = random.choice(list(d.items()))
Я предполагаю, что вы делаете викторину. Для такого приложения я написал функцию, которая выглядит следующим образом:
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
Вы можете расширить это еще больше, перетасовывая параметры, и я надеюсь, что это поможет. Источник: РАДИУС КРУГА
Поскольку это домашнее задание:
Проверьте random.sample()
, который будет выбирать и возвращать случайный элемент из списка. Вы можете получить список ключей словаря с dict.keys()
и список значений словаря с помощью dict.values()
.
Если вы не хотите использовать модуль 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 () полезен для деструктивного итерации по словарю
Попробуйте это (используя 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'
Попробуйте следующее:
import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]
Это определенно работает.
Если вы не хотите использовать 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'
Поскольку исходная запись хотела пару:
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}
country, capital = random.choice(list(d.items()))
(стиль python 3)
Я написал это, пытаясь решить ту же проблему:
https://github.com/robtandy/randomdict
Он имеет O (1 ) произвольный доступ к ключам, значениям и элементам.
>>> 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
словаря (страны).
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)