在列表中设置dict字段的Python方式是什么
我有两个列表,一个包含int值:在列表中设置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 = [{
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