在Python中,如何复制字典列表并过滤特定键(包括嵌套键)?
如果我有一个字典,其中包含列表、字典、字符串和整数,我如何复制该字典,但只能复制特定的白名单键 通过此函数过滤在Python中,如何复制字典列表并过滤特定键(包括嵌套键)?,python,Python,如果我有一个字典,其中包含列表、字典、字符串和整数,我如何复制该字典,但只能复制特定的白名单键 通过此函数过滤旧的\u dict,将得到新的\u dict。白名单键可以是任何格式,但解决方案应该能够获取包含任意白名单键的对象以生成输出 old_dict = [ { 'name': {'first': "John", 'last': "Doe"}, 'groups': ["foo", "bar"], 'widgets': [
旧的\u dict
,将得到新的\u dict
。白名单键可以是任何格式,但解决方案应该能够获取包含任意白名单键的对象以生成输出
old_dict = [
{
'name': {'first': "John", 'last': "Doe"},
'groups': ["foo", "bar"],
'widgets': [
{'id': 0, 'name': "Acme"},
{'id': 1, 'name': "Anvil"},
],
},
{
'name': {'first': "David"},
'groups': ["bar", "bash", "ding"],
'widgets': [
{'id': 1, 'name': "Anvil"},
{'id': 8, 'name': "Bingo"},
],
},
]
new_dict = [
{
'name': {'last': "Doe"},
'widgets': [
{'name': "Acme"},
{'name': "Anvil"},
],
},
{
'name': { },
'widgets': [
{'name': "Anvil"},
{'name': "Bingo"},
],
},
]
您可以将其添加到列表中,如下所示:
new_dic = [ dict( key, old_dic[key])
for key in whitelist
if key in old_dic)
for dic in old_dic ]
创建一个递归函数,处理每种类型,并在每次看到dict时过滤掉:
def keep_only(keys, val):
if type(val) is list:
return [keep_only(keys, v) for v in val]
if type(val) is dict:
return dict((k, keep_only(keys, v)) for k,v in val.items() if k in keys)
return val
示例用法:
>>> old_dict = [
{
'name': {'first': "John", 'last': "Doe"},
'groups': ["foo", "bar"],
'widgets': [
{'id': 0, 'name': "Acme"},
{'id': 1, 'name': "Anvil"},
],
},
{
'name': {'first': "David"},
'groups': ["bar", "bash", "ding"],
'widgets': [
{'id': 1, 'name': "Anvil"},
{'id': 8, 'name': "Bingo"},
],
},
]
>>> keep_only(set(['name', 'widgets', 'last']), old_dict)
[{'widgets': [{'name': 'Acme'}, {'name': 'Anvil'}], 'name': {'last': 'Doe'}}, {'widgets': [{'name': 'Anvil'}, {'name': 'Bingo'}], 'name': {}}]
>>> old_dict = [
{
'name': {'first': "John", 'last': "Doe"},
'groups': ["foo", "bar"],
'widgets': [
{'id': 0, 'name': "Acme"},
{'id': 1, 'name': "Anvil"},
],
},
{
'name': {'first': "David"},
'groups': ["bar", "bash", "ding"],
'widgets': [
{'id': 1, 'name': "Anvil"},
{'id': 8, 'name': "Bingo"},
],
},
]
>>> keep_only(set(['name', 'widgets', 'last']), old_dict)
[{'widgets': [{'name': 'Acme'}, {'name': 'Anvil'}], 'name': {'last': 'Doe'}}, {'widgets': [{'name': 'Anvil'}, {'name': 'Bingo'}], 'name': {}}]