2016-10-12 2 views
2

Я работаю с большим словарем, и по какой-то причине мне также нужно работать с небольшими случайными выборками из этого словаря. Как я могу получить этот небольшой образец (например, длина 2)?Получите случайный образец dict

Вот это игрушка-модель:

dy={'a':1, 'b':2, 'c':3, 'd':4, 'e':5} 

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

s=0 
for key in dy.key: 
    s=s+dy[key] 

Теперь, я также должен выполнить ту же задачу на случайной выборке ау; для этого мне нужна случайная выборка ключей dy. Простое решение, которое я могу себе представить, это

sam=list(dy.keys())[:1] 

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

s=0 
for key in sam: 
    s=s+dy[key] 

Дело в том, я не совсем понимаю, как dy.keys строится, и тогда я не могу предвидеть любые будущие проблемы

ответ

2

Учитывая ваш пример:

dy = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5} 

Тогда сумма всех значений проще говоря, как:

s = sum(dy.values()) 

Тогда, если это не память запретительные, вы можете попробовать с помощью:

import random 

values = list(dy.values()) 
s = sum(random.sample(values, 2)) 

Или, так как random.sample может занять set -как объект, а затем:

from operator import itemgetter 
import random 

s = sum(itemgetter(*random.sample(dy.keys(), 2))(dy)) 

или просто использовать:

s = sum(dy[k] for k in random.sample(dy.keys(), 2)) 

Альтернативой является использование heapq, например:

import heapq 
import random 

s = sum(heapq.nlargest(2, dy.values(), key=lambda L: random.random())) 
+0

Почему бы не просто создать список через random.sample? в чем преимущество использования устройства для создания предметов? – user2988577

+0

@ user2988577 'itemgetter' иногда может быть быстрее - иначе - просто напишите его как' sum (dy [k] для k в random.sample (dy.keys(), 2)) ' –