@EugeneLazutkin дает пример, где он называет назначенную функцию, чтобы иметь возможность использовать shortcut()
как внутреннюю ссылку на себя. Джон Ресиг дает другой пример - копирование рекурсивной функции, назначенной другому объекту в его учебном пособии Learning Advanced Javascript . Хотя назначение функций свойствам не является строго вопросом здесь, я рекомендую активно пробовать учебник - запустите код, нажав кнопку в правом верхнем углу, и дважды щелкните код для редактирования по своему вкусу.
Примеры из учебника: рекурсивные вызовы в yell()
:
Тесты завершаются, когда исходный объект ниндзя удален. (стр. 13)
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
assert( ninja.yell(4) == "hiyaaaa", "A single object isn't too bad, either." );
var samurai = { yell: ninja.yell };
var ninja = null;
try {
samurai.yell(4);
} catch(e){
assert( false, "Uh, this isn't good! Where'd ninja.yell go?" );
}
Если вы назовете функцию, которая будет называться рекурсивно, тесты пройдут. (стр. 14)
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
assert( ninja.yell(4) == "hiyaaaa", "Works as we would expect it to!" );
var samurai = { yell: ninja.yell };
var ninja = {};
assert( samurai.yell(4) == "hiyaaaa", "The method correctly calls itself." );
Один из способов (в 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.sample
и random.choice
не могут работать с итераторами. Им нужно знать длину последовательности, которая не может быть определена из итератора.
– AFoglia
1 February 2011 в 06:50
random.sample
возвращает k
случайные элементы i>, random.choice
возвращает один случайный элемент
– Anentropic
30 January 2014 в 15:05
Если вы не хотите использовать модуль 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
словаря (страны).
random.choice(list(d.keys()))
.
– Greenstick
23 March 2017 в 05:51
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)
d.keys()
- это список, но он не будет работать в Python 3.x, гдеd.keys()
является итератором. Вы должны сделатьrandom.choice(list(d.keys()))
. – Duncan 1 February 2011 в 10:42d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
Хе-хе, +1 за очень тонкое «промывание мозгов» ... – gentimouton 23 April 2014 в 20:19