我有一个非常简单(但真的很大(的a 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]
我想知道如何使它变得更性感和更有效(双循环 如果语句和我访问数据的方式相当糟糕(。我已经读过有关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_1
和field_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}}