#python
#python
Вопрос:
У меня есть словарь, который выглядит примерно так:
d = { 'a':['a','b','c','d'], 'b':['a','b','c','d'], 'c':['a','b','c','d'], 'd':['a','b','c','d'], }
Я хотел бы сократить этот словарь до нового, который содержит 2 ключа, случайно выбранных из полного набора ключей, а также содержит только значения, соответствующие этим случайным ключам.
Вот написанный мной код, который работает, но я чувствую, что, вероятно, есть более питонический способ сделать это, есть предложения?
импортировать случайным образом d = { 'a':['a','b','c','d'], 'b':['a','b','c','d'], 'c':['a','b','c','d'], 'd':['a','b','c','d'], } new_d = {} r = d.keys() random.shuffle(r) r = r[:2] r_dict = dict( (k, True) для k в r) для k в r_dict: a = кортеж(d[k]) new_a = [] для элемента в: если элемент в r_dict: new_a.append(элемент) new_d[k] = new_a
«new_d» отфильтровал словарь, например:
{'a': ['a', 'b'], 'b': ['a', 'b']}
Если ‘a’ и ‘b’ являются двумя случайными ключами.
Ответ №1:
Основанный на FM’s, с недостаточно используемым типом set:
>>> ks = set(random.sample(d, 2))
>>> dict((k, list(ks amp; set(d[k]))) for k in ks)
{'a': ['a', 'c'], 'c': ['a', 'c']}
Комментарии:
1. 1: Это намного, намного быстрее, чем решение @FM, и немного быстрее моего (@ FM: 16,5 мс; @twneale: 48 нс; @JoshAdel: 77 нс).
2. спасибо, это мое введение в set type, оно выглядит невероятно полезным
Ответ №2:
Как насчет следующего:
import random
rk = random.sample(d.keys(),2)
new_d = {}
for k in rk:
new_d[k] = list(set(d[k]).intersection(rk))
Ответ №3:
ks = set(random.sample(d.keys(), 2))
nd = dict( (k, list(v for v in d[k] if v in ks)) for k in ks )