在列表中设置dict字段的Python方式是什么

在列表中设置dict字段的Python方式是什么,python,list,dictionary,data-structures,Python,List,Dictionary,Data Structures,我有两个列表,一个包含int值: values = [5,10,15,20] 另一个是一个目录: dicts = [{'a':0, 'b':0, 'c':0}, {'a':0, 'b':0, 'c':0}, {'a':0, 'b':0, 'c':0}, {'a':0, 'b': 0, 'c':0}] 我想从值列表中获取第一个值,并将第一个dict的字段“a”与来自“值”列表的值一起设置,依此类推。换句话说,输出应为: dicts = [{

我有两个列表,一个包含int值:

values = [5,10,15,20]
另一个是一个目录:

dicts = [{'a':0, 'b':0, 'c':0},
         {'a':0, 'b':0, 'c':0},
         {'a':0, 'b':0, 'c':0},
         {'a':0, 'b': 0, 'c':0}]
我想从值列表中获取第一个值,并将第一个dict的字段“a”与来自“值”列表的值一起设置,依此类推。换句话说,输出应为:

dicts = [{'a':5, 'b':0, 'c':0},
         {'a':10, 'b':0, 'c':0},
         {'a':15, 'b':0, 'c':0},
         {'a':20, 'b': 0, 'c':0}]

Pythonic的方法是什么?

您可以使用
zip
为每个字典设置
'a'
的值。比如:

for dic,val in zip(dicts,values):
    dic['a'] = val
或者把它放在一个衬里中:

请注意,与前面的代码片段没有区别。这取决于你的眼睛最喜欢什么

我们在这里更新词典:我们不创建副本等。这是一个重要的区别,因为可能引用给定词典的变量将反映我们所做的更改

zip(…)
将一个或多个iterables(此处为
dicts
value
)作为输入,并生成这些iterables元素的元组。因此它发出:

(values[0],dicts[0]), (values[1],dicts[1]), ...
现在我们进行元组解包:我们将
val
dic
与一个
值和一个
dict
统一起来。因此,我们为每个元组设置
dic['a']

控制台测试:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> values = [5,10,15,20]
>>> dicts = [{'a':0, 'b':0, 'c':0},
...          {'a':0, 'b':0, 'c':0},
...          {'a':0, 'b':0, 'c':0},
...          {'a':0, 'b': 0, 'c':0}]
>>> for dic,val in zip(dicts,values): dic['a'] = val
... 
>>> dicts
[{'b': 0, 'c': 0, 'a': 5}, {'b': 0, 'c': 0, 'a': 10}, {'b': 0, 'c': 0, 'a': 15}, {'b': 0, 'c': 0, 'a': 20}]

为了一句通俗易懂的一句话(尽管我强烈建议你更喜欢威廉的答案,因为它清晰易懂):

编辑:删除字典键的多余
if
else

尝试以下代码:

values = [5,10,15,20]
dicts = [{'a':0, 'b':0, 'c':0},
         {'a':0, 'b':0, 'c':0},
         {'a':0, 'b':0, 'c':0},
         {'a':0, 'b': 0, 'c':0}]

res1 =  dict(zip(dicts[0],zip(*[d.values() for d in dicts])))# tronspose a list of dicts /// res1 = {'a': (0, 0, 0, 0), 'c': (0, 0, 0, 0), 'b': (0, 0, 0, 0)}
res1['a'] = values
res = [dict(zip(res1,t)) for t in zip(*res1.values())]# tronspose res1

那么
b
c
键呢?它们的值将保持为0吗?你的字典语法是错误的。真的,不要把它放在一行,错误地认为它有某种好处。切普纳:就我所知,对于Python解析器来说,没有任何区别。但是它更紧凑。非常感谢你的回答。这确实是我要找的。请注意,这将是字典的副本。这可能是一个重要的区别,因为引用旧词典的其他变量不会反映更改。(我不是说这是个问题,但也许值得一提)。@StefanPochmann我只是在看这个。。。有点多余,是吗?谢谢你指出这一点。
dicts = [{key: val if key != 'a' else z_val 
            for key, val in d.items()} for d, z_val in zip(dicts, values)]

dicts
Out[5]: 
[{'a': 5, 'b': 0, 'c': 0},
 {'a': 10, 'b': 0, 'c': 0},
 {'a': 15, 'b': 0, 'c': 0},
 {'a': 20, 'b': 0, 'c': 0}]
values = [5,10,15,20]
dicts = [{'a':0, 'b':0, 'c':0},
         {'a':0, 'b':0, 'c':0},
         {'a':0, 'b':0, 'c':0},
         {'a':0, 'b': 0, 'c':0}]

res1 =  dict(zip(dicts[0],zip(*[d.values() for d in dicts])))# tronspose a list of dicts /// res1 = {'a': (0, 0, 0, 0), 'c': (0, 0, 0, 0), 'b': (0, 0, 0, 0)}
res1['a'] = values
res = [dict(zip(res1,t)) for t in zip(*res1.values())]# tronspose res1