我有两个有序的词组D1
和D2
。我想将D2
的密钥名称分配给D1
(覆盖D1
的现有密钥名称)。怎么做?
示例:
D1 = {'first_key': 10, 'second_key': 20}
D2 = {'first_new_key': 123, 'second_new_key': 456}
现在我想将D2
的关键名称分配给D1
,以便D1
成为
{'first_new_key': 10, 'second_new_key': 20}
答案 0 :(得分:4)
这是一个解决方案:
Public Function ScanJson()
Dim FSO As New FileSystemObject
Dim JsonTS As TextStream
Dim JsonText As String
Dim Parsed As Dictionary
Dim strPath As String
Dim blnSuccess As Boolean
strPath = CurrentProject.Path & "\test_Json.txt"
' Read .json file
Set JsonTS = FSO.OpenTextFile(strPath, ForReading)
JsonText = JsonTS.ReadAll
JsonTS.Close
'clean string
JsonText = Replace(JsonText, vbCrLf, "")
JsonText = Replace(JsonText, vbTab, "")
' Parse json to Dictionary
' "values" is parsed as Collection
' each item in "values" is parsed as Dictionary
Set Parsed = JsonConverter.ParseJson(JsonText)
'test theres data
blnSuccess = Parsed("au")("success")
If blnSuccess Then
For Each Value In Parsed("au")("data")
On Error Resume Next
Debug.Print Value("events")
Debug.Print Value("events")(0)(1)
Debug.Print Value("participants")(0)
Debug.Print Value("participants")(1)
Debug.Print Value("commence")
Debug.Print Value("status")
Next Value
Else
MsgBox "No data for Key: AU "
End If
End Function
如果你进入1-liners(这就是为什么我们有python,对吧?):
keys = D2.keys()
values = D1.values()
new_dict = dict(zip(keys, values))
如评论中所述,2个字典之间的插入顺序必须匹配。
编辑
我发现你要覆盖new_dict = dict(zip(D2.keys(), D1.values()))
。在这种情况下,你可以简单地做:
D1
编辑2
正如Barmar在另一个回答中所提到的,为了订购词典,必须使用collections.OrderedDict()
。
答案 1 :(得分:2)
for (old_key, old_val), new_key in zip(list(D1.items()), D2.keys()):
del D1[old_key]
D1[new_key] = old_val
Python 3中需要list()
包装器,因为items()
是一个生成器,你无法修改被迭代的dict。
答案 2 :(得分:0)
最简单的方法就是字典分配:
D1 = {'first_key': 10, 'second_key': 20}
D2 = {'first_new_key': 123, 'second_new_key': 456}
D2['first_new_key'] = D1['first_key']
D2['second_new_key'] = D1['second_key']
但是,对于较大的词典,使用字典理解可能更好:
D1 = {a:D1[a.split('_')[0]+"_key"] for a, _ in D2.items()}
输出:
{'second_new_key': 20, 'first_new_key': 10}