gpt4 book ai didi

python - 将嵌套字典的键替换为另一个字典的值(其中两个字典的键相等)),键的值可以是字典列表

转载 作者:太空狗 更新时间:2023-10-30 02:43:03 24 4
gpt4 key购买 nike

我有两个字典,dict1 和 dict2,我想用键值对构造新的字典(或操作字典 1)为(字典 2 的值:字典 1 的值 [其中字典 1 的键和字典 2 的键相同] ) ,键的值可能是字典列表(正如您将在输入示例中看到的那样)

输入是

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 - 将嵌套字典的键替换为另一个字典的值(其中两个字典的键相等)),键的值可以是字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34706431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com