【问题标题】:How to modify Python dictionary value and create the list of dictionaries?如何修改 Python 字典值并创建字典列表?
【发布时间】:2016-09-30 17:17:53
【问题描述】:

我想修改字典并创建一个列表,其中包含具有修改后值的字典。我试过了:

mylist = []
mydict = {"one": 10, "two": 20, "three": 30}
for i in [111, 222, 333]:
   mydict["two"] = i
   mylist.append(mydict)

mylist 返回:

[{'three': 30, 'two': 333, 'one': 10}, {'three': 30, 'two': 333, 'one': 10},  {'three': 30, 'two': 333, 'one': 10}]

我希望得到:

[{'three': 30, 'two': 111, 'one': 10}, {'three': 30, 'two': 222, 'one': 10},  {'three': 30, 'two': 333, 'one': 10}]

我该怎么做?

【问题讨论】:

    标签: python list dictionary append


    【解决方案1】:

    那是因为您只是创建了对同一个对象(您的字典)的多个引用,并将一次性变量 i 分配给在最后一次迭代中保存 333 的键并将其分配给 two 键,您的所有字典名称将指向与项目 ('two', 333) 相同的对象。

    您可以使用字典推导来解决这个问题:

    >>> mylist = [{"one": 10, "two": i, "three": 30} for i in [111, 222, 333]]
    >>> mylist
    [{'three': 30, 'two': 111, 'one': 10}, {'three': 30, 'two': 222, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}]
    

    或者您可以在每次迭代中创建初始对象的副本,以便创建新对象,而不仅仅是复制引用。

    >>> from copy import copy
    >>> mylist = []
    >>> mydict = {"one": 10, "two": 20, "three": 30}
    >>> for i in [111, 222, 333]:
    ...    mydict["two"] = i
    ...    mylist.append(copy(mydict))
    ... 
    >>> mylist
    [{'one': 10, 'three': 30, 'two': 111}, {'one': 10, 'three': 30, 'two': 222}, {'one': 10, 'three': 30, 'two': 333}]
    

    如果您有多个要修改的键,作为一种更 Pythonic 的方法,您可以这样做:

    >>> for i, j in zip(my_keys, my_new_values):
    ...    mydict[i] = j
    ...    mylist.append(copy(mydict))
    

    【讨论】:

    • 感谢您的快速回复。其作品。附加问题,如果我想修改 2 个或更多值非常长的字典。你有一个强大而优雅的解决方案吗?
    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2022-01-16
    • 2023-02-07
    • 2022-11-18
    • 2012-08-04
    • 1970-01-01
    相关资源
    最近更新 更多