【问题标题】:How to iteratively update the value of a dict and add each representation to a list [duplicate]如何迭代更新字典的值并将每个表示添加到列表中[重复]
【发布时间】:2019-10-06 14:23:01
【问题描述】:

当我在循环中更新字典的值时,它也会更改列表中已有字典的值。

我已经在 Python 3.7 中尝试过以下代码

d = {"name": "v0"}
a = []
b = ["v1", "v2", "v3"]
for i in b:
    d["name"] = i
    a.append(d)
print(a)

我希望它在循环中更改字典,并将每个表示添加到列表中。但是,它会将相同的值添加到列表中。

【问题讨论】:

  • 永远不要尝试通过迭代字典并就地修改字典来修改它。要么use a dict comprehension over dict.items(),要么复制字典。
  • 这里的预期输出是什么?
  • 您的代码每次都会覆盖键值,因为您将单个键用作硬编码。字典不允许您多次存储同一个键。
  • 如果您使密钥动态且不同,它允许您存储它: b = ["v1", "v2", "v3"] d = {"name": "v0"} for i in range(len(b)): d["name-"+str(i)]=b[i] print(d) 否则直接追加而不分配给dict每个键值对元素:a=[{"name ": "v0"}] b = ["v1", "v2", "v3"] for i in range(len(b)): a.append({"name":b[i]}) print(一)

标签: python python-3.x


【解决方案1】:

每次创建一个新字典:

a = []
b = ["v1", "v2", "v3"]
for i in b:
    a.append({"name": i})
print(a)

作为理解:

a = [{"name": i} for i in b]

如果你的字典太大大,你可以用理解从它重建另一个:

a = [{"name": i if k == "name" else k:v for k,v in d.items() for i in b]

【讨论】:

  • 打我一拳 :) +1
  • 谢谢!我的字典远大于一个值,我不想再用代码写出我的完整字典。有没有一种 Pythonic 方式来改变字典中的值?
  • @lorenzkort,查看最新更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2019-11-21
  • 2017-02-25
  • 2019-12-18
相关资源
最近更新 更多