python – 用另一个字典的值替换嵌套字典的键(两个字典的键相等)),键的值可以是dicts列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 用另一个字典的值替换嵌套字典的键(两个字典的键相等)),键的值可以是dicts列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3724字,纯文字阅读大概需要6分钟。
内容图文
![python – 用另一个字典的值替换嵌套字典的键(两个字典的键相等)),键的值可以是dicts列表](/upload/InfoBanner/zyjiaocheng/810/4240892016f3484f93f900da2e9fa835.jpg)
我有两个dict,dict1和dict2,我想用键值对构造新的dict(或操作dict1)(dict2的值:dict1的值[其中dict的键和dict2的键相同]),value键的列表可能是dicts列表(正如您将在输入示例中看到的那样)
输入是
dict1 = {"key1":{"key3":"value1","key2":"value2","key4":{"key5":"value3","key6":{"key7":"value4","key8":{"key9":"value5","key10":"value6","key55":"value7"}},"key11":{"key12":"value8","key13":"value9"},"key14":[{"key15":"value10","key16":"value11","key17":"value12"},{"key15":"value13","key16":"value14","key17":"value15"}]}}}
dict2 = {"key1":"ab","key2":"bc","key3":"cd","key4":"de","key5":"ef","key6":"fg","key7":"gh","key8":"hi","key9":"ij","key10":"jk","key55":"kl","key11":"lm","key12":"mn","key13":"no","key14":"op","key15":"pq","key16":"qr","key17":"qs"}
我的功能是
def walk(dict1, dict2):
output = {}
for key, value in dict1.iteritems():
if isinstance(value, dict):
output[dict2[key]] = walk(value, dict2)
elif isinstance(value, list):
output[dict2[key]] = walk_list(value, dict2)
else:
output[dict2[key]] = value
return output
def walk_list(sublist, dict2):
output = []
for i in sublist:
if isinstance(i, dict):
output = walk(i, dict2)
elif isinstance(value, list):
output = walk_list(i, dict2)
else:
output.append((key, value))
return output
output = walk(dict1, dict2)
output = json.dumps(output)
print output
输出就是
{"ab": {"de": {"lm": {"mn": "value8", "no": "value9"}, "ef": "value3", "fg": {"hi": {"ij": "value5", "jk": "value6", "kl": "value7"}, "gh": "value4"}, "op": {"pq": "value13", "qs": "value15", "qr": "value14"}}, "bc": "value2", "cd": "value1"}}
预期产出是
{"ab":{"cd":"value1","bc":"value2","de":{"ef":"value3","fg":{"gh":"value4","hi":{"ij":"value5","jk":"value6","kl":"value7"}},"lm":{"mn":"value8","no":"value9"},"op":[{"pq":"value10","qr":"value11","qs":"value12"},{"pq":"value13","qr":"value14","qs":"value15"}]}}}
请修复我的代码.
解决方法:
非常简单的解决方案,很早就执行递归步骤,因此有一个非常简单的逻辑:
def translateKeys (obj, keyNames):
if isinstance(obj, dict):
return {keyNames.get(k, k): translateKeys(v, keyNames) for k, v in obj.items()}
elif isinstance(obj, list):
return [translateKeys(v, keyNames) for v in obj]
else:
return obj
它不是期望某种类型,而是接受任何东西(字典,列表或其他)并对它的项目起作用,为每个值调用自己.这避免了必须迭代obj本身并检查循环中每个项的值.
用于示例数据:
>>> dict1 = {"key1":{"key3":"value1","key2":"value2","key4":{"key5":"value3","key6":{"key7":"value4","key8":{"key9":"value5","key10":"value6","key55":"value7"}},"key11":{"key12":"value8","key13":"value9"},"key14":[{"key15":"value10","key16":"value11","key17":"value12"},{"key15":"value13","key16":"value14","key17":"value15"}]}}}
>>> dict2 = {"key1":"ab","key2":"bc","key3":"cd","key4":"de","key5":"ef","key6":"fg","key7":"gh","key8":"hi","key9":"ij","key10":"jk","key55":"kl","key11":"lm","key12":"mn","key13":"no","key14":"op","key15":"pq","key16":"qr","key17":"qs"}
>>> expected = {"ab":{"cd":"value1","bc":"value2","de":{"ef":"value3","fg":{"gh":"value4","hi":{"ij":"value5","jk":"value6","kl":"value7"}},"lm":{"mn":"value8","no":"value9"},"op":[{"pq":"value10","qr":"value11","qs":"value12"},{"pq":"value13","qr":"value14","qs":"value15"}]}}}
>>> result = translateKeys(dict1, dict2)
>>> result
{'ab': {'de': {'fg': {'gh': 'value4', 'hi': {'ij': 'value5', 'jk': 'value6', 'kl': 'value7'}}, 'op': [{'qr': 'value11', 'pq': 'value10', 'qs': 'value12'}, {'qr': 'value14', 'pq': 'value13', 'qs': 'value15'}], 'ef': 'value3', 'lm': {'no': 'value9', 'mn': 'value8'}}, 'cd': 'value1', 'bc': 'value2'}}
>>> result == expected
True
如果要反转此转换,只需反转keyNames并对结果执行转换:
>>> result = translateKeys(dict1, dict2)
>>> invertedKeyNames = {v: k for k, v in dict2.items()}
>>> original = translateKeys(result, invertedKeyNames)
>>> original == dict1
True
内容总结
以上是互联网集市为您收集整理的python – 用另一个字典的值替换嵌套字典的键(两个字典的键相等)),键的值可以是dicts列表全部内容,希望文章能够帮你解决python – 用另一个字典的值替换嵌套字典的键(两个字典的键相等)),键的值可以是dicts列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。