我有一个python字典,如下所示:
old_dict={"payment_amt": "20",
"chk_nr": "321749",
"clm_list": {"dtl": [{"clm_id": "1A2345", "name": "John"},
{"clm_id": "9999", "name": "Jack"}]}}
我需要解析上面的内容并将其存储为:
{"payment_amt": "20",
"clm_list": {"dtl": [{"clm_id": "1A2345"},
{"clm_id": "9999"}]}}
有没有正确的pythonic方法呢?
由于
答案 0 :(得分:2)
是的,有许多“正确的pythonic方式”。 这是一种这样的方式:
old_dict = {
"payment_amt": "20",
"chk_nr": "321749",
"clm_list": {
"dtl": [
{"clm_id": "1A2345", "name": "John"},
{"clm_id": "9999", "name": "Jack"}]}}
new_dict = {
'payment_amt': old_dict['payment_amt'],
'clm_list': {
'dtl': [{
'clm_id': dtl['clm_id']} for dtl in old_dict['clm_list']['dtl']]}}
assert new_dict == {
"payment_amt": "20",
"clm_list": {"dtl": [{"clm_id": "1A2345"}, {"clm_id": "9999"}]}}
答案 1 :(得分:2)
就个人而言,如果输入总是与您列出的完全相同,我会在您发布的示例中使用您想要保留的确切键的简单副本(请参阅Rob的答案)。保持简单。
但是,如果您不能依赖输入始终具有相同的确切结构,您仍然可以将其减少为仅包含具有使用dict理解的递归函数的预期键。
old_dict = {"payment_amt": "20",
"chk_nr": "321749",
"clm_list": {"dtl": [{"clm_id": "1A2345", "name": "John"},
{"clm_id": "9999", "name": "Jack"}]}}
keep = ["payment_amt", "clm_list", "dtl", "clm_id"]
def recursively_prune_dict_keys(obj, keep):
if isinstance(obj, dict):
return {k: recursively_prune_dict_keys(v, keep) for k, v in obj.items() if k in keep}
elif isinstance(obj, list):
return [recursively_prune_dict_keys(item, keep) for item in obj]
else:
return obj
new_dict = recursively_prune_dict_keys(old_dict, keep)
print new_dict
输出:
{'clm_list': {'dtl': [{'clm_id': '1A2345'}, {'clm_id': '9999'}]}, 'payment_amt': '20'}
答案 2 :(得分:1)
你可以创建一个“模板”字典/ list / whatever并定义一个递归方法,该方法遍历输入对象(某种嵌套列表/字典事物)和模板并行,并保留那些元素。模板中的相应位置。在基本版本中,这可能看起来像这样(但肯定可以扩展到涵盖更多情况):
<div ng-repeat="car in cars | orderBy:'make + model'">
这里,假设def prune_dict(obj, template):
if template is None:
return obj
if isinstance(template, dict):
return {key: prune_dict(obj[key], template[key]) for key in template}
if isinstance(template, list):
return [prune_dict(x, template[0]) for x in obj]
是另一个字典或列表。 template
用于表示结构中的“叶子”。对于None
,假定模板仅包含一个元素,该元素用作所有列表元素的模板。对于list
,它将保留模板中表示的所有值。
适用于您的用例:
dict