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

@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." );

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

12 ответов

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

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

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

country, capital = random.choice(list(d.items()))
183
ответ дан Alexander Reynolds 21 August 2018 в 15:53
поделиться
  • 1
    Это будет работать в Python 2.x, где d.keys() - это список, но он не будет работать в Python 3.x, где d.keys() является итератором. Вы должны сделать random.choice(list(d.keys())). – Duncan 1 February 2011 в 10:42
  • 2
    @Duncan: Я не могу дождаться, когда все сторонние библиотеки совместимы с Python 3.x, поэтому на вопросы Python не нужно 2 ответа на каждый вопрос. – Gerrat 1 February 2011 в 14:54
  • 3
    Err как насчет: d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'} Хе-хе, +1 за очень тонкое «промывание мозгов» ... – gentimouton 23 April 2014 в 20:19
  • 4
    @gentimouton ... интересно, но, может быть, я просто собирался в самый густонаселенный город в каждой стране - не в столицах :) – Gerrat 24 April 2014 в 20:46
  • 5
    Является ли это эффективным? Является ли этот масштаб, если дикт становится действительно большим? – Pei 25 July 2015 в 19:11

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

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 21 August 2018 в 15:53
поделиться

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

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

4
ответ дан carl 21 August 2018 в 15:53
поделиться
  • 1
    random.sample и random.choice не могут работать с итераторами. Им нужно знать длину последовательности, которая не может быть определена из итератора. – AFoglia 1 February 2011 в 06:50
  • 2
    нет, это НЕ домашнее задание, я пишу это, чтобы помочь мне с испанским. – tekknolagi 1 February 2011 в 06:56
  • 3
    random.sample возвращает k случайные элементы , random.choice возвращает один случайный элемент – Anentropic 30 January 2014 в 15:05
  • 4
    Да ... никогда не круто считать, что это проблема домашней работы. Что говорят об этом для сообщества? – jvriesem 28 March 2017 в 17:35

Если вы не хотите использовать модуль 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 21 August 2018 в 15:53
поделиться
  • 1
    Это плохо, потому что, если вы загрузите словарь в том же порядке в той же версии python, вы почти наверняка получите тот же самый элемент. – Alex 22 May 2014 в 18:43
  • 2
    – Ciro Santilli 新疆改造中心 六四事件 法轮功 11 November 2016 в 12:01
  • 3
    python 3.6 dict на самом деле ORDERED ! Это очень важно – Or Duan 30 January 2017 в 17:01
  • 4
    Этот ответ просто неправильный. Даже до 3.6 это не даст вам случайное значение, а значение, зависящее от хэш-значения от элемента. – OBu 25 June 2018 в 20:27
  • 5

Попробуйте это (используя 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 21 August 2018 в 15:53
поделиться

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

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

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

6
ответ дан lavee_singh 21 August 2018 в 15:53
поделиться

Если вы не хотите использовать 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 21 August 2018 в 15:53
поделиться

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

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

(стиль python 3)

3
ответ дан OBu 21 August 2018 в 15:53
поделиться

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

https://github.com/robtandy/randomdict

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

22
ответ дан Rob T 21 August 2018 в 15:53
поделиться
>>> 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 21 August 2018 в 15:53
поделиться
  • 1
    Привет, Я пытаюсь использовать ваш метод, чтобы случайно выбрать один ключ из данного словаря, но он не работает. Мой словарь выглядит как a = {'walk': 20, 'run': 80}, и когда я использую random.choice (a.keys ()), есть ошибка, например, объект «dict_keys» не поддерживает индексирование ». Вы знаете, что случилось? Большое спасибо!!! – beepretty 11 May 2016 в 04:50
  • 2
    @beepretty dict.keys () возвращает итерируемый объект, а не объект, подобный списку. Чтобы устранить ошибку, используйте random.choice(list(d.keys())). – Greenstick 23 March 2017 в 05:51
  • 3
    Вместо этого используйте random.sample, что дешевле, чем копирование ключей в список. – steveayre 9 August 2018 в 13:35
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 21 August 2018 в 15:53
поделиться
0
ответ дан firelynx 1 November 2018 в 09:16
поделиться
Другие вопросы по тегам:

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