用于过滤数组字典的pythonic方法

时间:2011-04-12 02:24:59

标签: python

我有一个字典,看起来像这样:


d = { 'a':['a','b','c','d'], 
      'b':['a','b','c','d'], 
      'c':['a','b','c','d'], 
      'd':['a','b','c','d'], }

我想将这个字典缩小为一个新字典,其中包含从完整密钥集中随机选择的2个密钥,并且只包含与这些随机密钥对应的值。

这是我写的代码有效,但我觉得可能有更多的pythonic方式来做,有什么建议吗?

import random

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) for k in r)
for k in r_dict:
    a = tuple(d[k])
    new_a = []
    for item in a:
        if item in r_dict:
            new_a.append(item)
    new_d[k] = new_a

“new_d”已过滤字典,例如:


{'a': ['a', 'b'], 'b': ['a', 'b']}

如果'a'和'b'是两个随机密钥。

3 个答案:

答案 0 :(得分:1)

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 )

答案 1 :(得分:1)

以下内容如何:

import random
rk = random.sample(d.keys(),2)
new_d = {}
for k in rk:
    new_d[k] = list(set(d[k]).intersection(rk))

答案 2 :(得分:1)

以FM为基础,使用未充分利用的set类型:

>>> ks = set(random.sample(d, 2))
>>> dict((k, list(ks & set(d[k]))) for k in ks)
{'a': ['a', 'c'], 'c': ['a', 'c']}