питонический способ фильтрации словаря массивов

#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 )