Получить случайное подмножество словаря - PullRequest
0 голосов
/ 02 ноября 2018

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : я знаю есть вопрос с именем

Получить случайную выборку из диктанта

но мой, конечно, не дубликат. Ответы на этот вопрос в основном сосредоточены на вычислении суммы значений случайного подмножества словаря, потому что именно этого действительно хотел ОП. Вместо этого мне действительно нужно извлечь подмножество.

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

import random
dictionary = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
keys = random.sample(dictionary, 3)
sample = dictionary[keys]

Но это не работает:

Traceback (most recent call last):
  File "[..]/foobar.py", line 4, in <module>
    sample = dictionary[keys]
TypeError: unhashable type: 'list'

Это работает:

import random
dictionary = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
keys = random.sample(dictionary, 3)
sample = {key: dictionary[key] for key in keys}

Кажется, это немного словечко: я надеялся, что будет найден векторизованный способ создания нового словаря. Тем не менее, это правильный / самый Pythonic способ сделать это? Кроме того, если я хочу повторить этот пример, я должен сделать так:

for key, value in sample.iteritems():
    print(key, value)

Мой вопрос не является дубликатом

как случайным образом выбрать несколько ключей и их значение в словаре python

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

1 Ответ

0 голосов
/ 06 ноября 2018

С

dict(random.sample(dictionary.items(), N))

вы можете выбрать N случайные пары (ключ, значение) из вашего словаря и передать их конструктору dict.

Демо-версия:

>>> import random
>>> dictionary = dict(enumerate(range(10)))
>>> dictionary
>>> {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
>>> N = 3
>>> dict(random.sample(dictionary.items(), N))
>>> {3: 3, 6: 6, 9: 9}
...