制作字典列表,使用迭代器覆盖列表中的一个键条目

make list of dictionaries overwriting one key entry from a list using iterators

我有一种可怕的感觉,这将是重复的,我已经尽力找到答案了。

我有一个字典和一个列表,我想创建一个字典列表,使用列表覆盖其中一个键值,如下所示:

d={"a":1,"b":10}      
c=[3,4,5] 
arg=[]
for i in c:
    e=d.copy()
    e["a"]=i
    arg.append(e)

这给出了想要的结果

arg
[{'a': 3, 'b': 10}, {'a': 4, 'b': 10}, {'a': 5, 'b': 10}]

但是代码很丑陋,尤其是使用复制命令时,在我的真实示例中我有 4 或 5 个列表而不是一个列表,这导致了一个巨大的嵌套循环。我确信有一个像

这样的迭代器更简洁的方法
arg=[d *with* d[a]=i for i in c] 

我不确定用什么来代替“with”。

再次抱歉,如果已经回答了这个问题。

IIUC,你可以这样做:

d={"a":1,"b":10}
c=[3,4,5]

res = [{ **d, "a" : ci } for ci in c]
print(res)

输出

[{'a': 3, 'b': 10}, {'a': 4, 'b': 10}, {'a': 5, 'b': 10}]

部分:

"a" : ci

重写键 "a" 处的值,**d 解压字典。

我会这样做:

arg=[d.copy() for i in range(len(c))]
for i in range(len(arg)):
    arg[i]['a']=c[i]

此代码首先创建一个长度为 c 的字典列表,然后为每个字典更新 'a',相应的 itme 为 c

您可以在列表推导中使用字典推导,检查键 == 'a':

d = {"a":1,"b":10}
c = [3,4,5]
l = [{k: num if k == 'a' else v for k,v in d.items()} for num in c]

在 Python 3.9 中,有一种新方法可以使用更新值创建新字典并保留旧字典而不更新 - 使用运算符 |

new_dict = old_dict | dict_with_updates

有了列表理解,它将是

arg = [ d | {"a": i} for i in c]

完整示例

d = {"a": 1, "b": 10}
c = [3, 4, 5]

arg = [ d | {"a": i} for i in c]

print(arg)

顺便说一句:还有 |= 更新现有词典

old_dict |= dict_with_updates

文档:What’s New In Python 3.9