如何将有序dict的键更改为Python中其他有序dict的键的键?

时间:2018-01-15 19:41:54

标签: python dictionary ordereddictionary

我有两个有序的词组D1D2。我想将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}

3 个答案:

答案 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)

如果可以创建新词典,那么noamgot的答案将会起作用。如果您需要修改现有字典:

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。

DEMO

答案 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}