过滤dict的词典

时间:2011-05-13 13:33:22

标签: python dictionary filter

我是Python的新手,我不确定使用dict的dict是个好主意,但这是我的问题。 我有一个dict的词典,我想通过内部词典的键过滤:

a ={ 'key1' : {'id1' :[0,1,2] , 'id2' :[0,1,2], 'id3' :[4,5,6]}
     'key2' : {'id3' :[0,1,2] , 'id4' :[0,1,2]}
     'key3' : {'id3' :[0,1,2] , 'id1' :[4,5,6]}
   }

例如,我想通过'id1'过滤得到:

result = { 'key1' : {'id1' :[0,1,2] }
           'key3' : {'id1' :[4,5,6]}
         }

我已经尝试了过滤方法,我得到了所有的值:

r = [('key1' ,{'id1' :[0,1,2] , 'id2' :[0,1,2], 'id3' :[4,5,6]})
     ('key3' , {'id3' :[0,1,2] , 'id1' :[4,5,6]})
   ]

此外,filter方法返回一个列表,我想将格式保留为dict。

提前致谢

4 个答案:

答案 0 :(得分:5)

试试这个:

>>> { k: v['id1'] for k,v in a.items() if 'id1' in v }
{'key3': [4, 5, 6], 'key1': [0, 1, 2]}

对于Python 2.x,您可能更喜欢使用iteritems()而不是items(),并且您仍然需要一个非常新的python(我认为是2.7)来进行字典理解:对于较旧的pythons使用:

dict((k, v['id1']) for k,v in a.iteritems() if 'id1' in v )

如果你想提取多个值,那么我认为你最好只是完整地编写循环:

def query(data, wanted):
    result = {}
    for k, v in data.items():
        v2 = { k2:v[k2] for k2 in wanted if k2 in v }
        if v2:
            result[k] = v2
    return result

,并提供:

>>> query(a, ('id1', 'id2'))
{'key3': {'id1': [4, 5, 6]}, 'key1': {'id2': [0, 1, 2], 'id1': [0, 1, 2]}}

答案 1 :(得分:2)

根据你给Duncan的精确度,这是使用字典理解在列表上的另一个过滤:

>>> my_list = ['id1', 'id2']
>>> {k1 : {k2: v2 for (k2, v2) in a[k1].iteritems() if k2 in my_list} for k1 in a}
{'key3': {'id1': [4, 5, 6]}, 'key2': {}, 'key1': {'id2': [0, 1, 2], 'id1': [0, 1, 2]}}

编辑:你也可以用另一个dict compreehension删除空值,但是“开始”难以阅读......: - )

>>> {k3: v3 for k3, v3 in {k1 : {k2: v2 for (k2, v2) in a[k1].iteritems() if k2 in my_list} for k1 in a}.iteritems() if v3}
{'key3': {'id1': [4, 5, 6]}, 'key1': {'id2': [0, 1, 2], 'id1': [0, 1, 2]}}

答案 2 :(得分:1)

你可以使用字典理解:

def query(data, query):
    return {key : {query : data[key][query]} 
            for key in data if query in data[key]}

你必须查看字典的每个条目,如果你有很多条目或者这么做很多,这可能会花费很多时间。带索引的数据库可以加快速度。

答案 3 :(得分:1)

field = 'id1'
dict( (k,{field: d[field]}) for k,d in a.items() if field in d)