繁体   English   中英

Python高效过滤字典的方法

[英]Python efficient way to filter dict

我有一个非常简单(但很大)的JSON文件,我需要对其进行过滤。 (我已经有一段时间没有做任何Python了...)

看起来像这样:

{
    'entry_1': {
        'field_1' : 'value',
        'field_2' : 123,
        'field_3' : '',
        'field_4' : 456
    },
    'entry_2': {
        'field_1' : 'value',
        'field_2' : 321,
        'field_3' : 'value',
        'field_4' : 654
    },
    ...
}

我想对其进行过滤以删除无用的字段。 我所做的测试文件很小,可以很好地工作,但是我需要在一个很大的文件上进行测试,而且我知道我的代码很丑陋。

到目前为止,我已经做到了:

dict_in = json.load(INFILE)
dict_out = defaultdict(dict) #4harambe

allowed_fields = {'field_1', 'field_3'} 
'''should I use a set or a tuple here ? or maybe something else
All data inside will be unique (set) but 
those data wont change (tuple)
'''

for entry in dict_in:
    for field in dict_in[entry]:
        if field in allowed_fields and not dict_in[entry][field]:
            # allowed field plus non empty string
            dict_out[entry][field] = dict_in[entry][field]

我想知道如何使其更具性感和效率(双循环+ if语句以及访问数据的方式非常糟糕)。 我已经阅读过有关itertools的文章,但我还不知道如何使用它,如果这是个好主意。

只是:

dict_out = {k: {f: v[f] for f in allowed_fields if v.get(f)} 
            for k, v in dict_in.items()}

注意:

如果您仍在使用python 2.7,请使用.iteritems()而不是.items()

您可以使用dictionary comprehensions来编写它:

allowed_fields = {'field_1', 'field_3'}
dict_out = {
    entry_key: {
        field: field_value
        for field, field_value in entry_value.items()
        if field in allowed_fields and field_value
    }
    for entry_key, entry_value in dict_in.items()
}

这将为所有field_1field_3键提供非空值:

{'entry_1': {'field_1': 'value'},
 'entry_2': {'field_1': 'value', 'field_3': 'value'}}

无需迭代内部dicts只需直接获取值即可:

def grabber(d, fields, default=None):
    return dict((f, d.get(f, default)) for f in fields) 

dict_out = {k:grabber(v, allowed_fields) for k,v in dict_in.items()} 

给定dict_in作为输入和您需要的fields

fields = ['field_1', 'field_4']
dict_out = dict([(k, {_k: _v for _k, _v in v.items() if _k in fields}) for k, v in dict_in.items()])

dict_out将如下所示:

{'entry_1': {'field_1': 'value', 'field_4': 456},
 'entry_2': {'field_1': 'value', 'field_4': 654}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM