Python 过滤一段一段的口述

Python 过滤一段一段的口述,python,dictionary,filter,Python,Dictionary,Filter,我是Python新手,我不确定使用dict of dict是个好主意,但我的问题是。 我有一个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]} } 例如,我希望按“i

我是Python新手,我不确定使用dict of dict是个好主意,但我的问题是。 我有一个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

提前感谢

试试这个:

>>> { k: v['id1'] for k,v in a.items() if 'id1' in v }
{'key3': [4, 5, 6], 'key1': [0, 1, 2]}
对于Python2.x,您可能更喜欢使用
iterms()
而不是
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]}}

您可以使用字典理解:

def query(data, query):
    return {key : {query : data[key][query]} 
            for key in data if query in data[key]}
>>> 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]}}

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

根据您给Duncan的精度,下面是使用字典理解对列表进行的另一个筛选:

def query(data, query):
    return {key : {query : data[key][query]} 
            for key in data if query in data[key]}
field = 'id1'
dict( (k,{field: d[field]}) for k,d in a.items() if field in d)
>>> 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压缩来删除空值,但“开始”很难读取…:-)


我认为你需要使用一些数据处理技术。根据您的输出规范,您可能需要使用自定义对象。实际上,我正在解析一个大的csv文件(30 mb),因此如何提高速度?这非常有效,但实际上我不想只过滤一个值,而只过滤一个列表值(例如,['id1,'id2'])对Python < 2.7没有好处。可怜的空洞的字典潜伏在中间。我认为在这一点上,放弃字典理解是值得的,只要把所有的内容都写下来就行了:看看我最新的答案