我有两个列表,一个包含int值:
values = [5,10,15,20]
另一个是dicts列表:
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}]
我想从值列表中获取第一个值并设置字段" 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的做法是什么?
答案 0 :(得分:4)
您可以使用zip
为每个字典设置'a'
的值。类似的东西:
for dic,val in zip(dicts,values):
dic['a'] = val
或将其放入单行:
for dic,val in zip(dicts,values): dic['a'] = val
请注意,与之前的代码片段存在无差异。这取决于你的眼睛最喜欢什么。
我们在这里更新词典:我们不会创建副本等。这是一个重要的区别,因为可以引用给定词典的变量将反映我们所做的更改。
zip(..)
将序列或更多迭代(此处为dicts
和values
)作为输入,并生成这些迭代元素的元组。所以它发出:
(values[0],dicts[0]), (values[1],dicts[1]), ...
现在我们执行 tuple-unpacking :我们将val
和dic
与values
和dicts
中的一个统一起来。因此,对于每个元组,我们设置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}]
答案 1 :(得分:1)
为了Pythonic单行(虽然我强烈建议你更喜欢Willem的答案是为了清晰/可读性):
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}]
编辑:删除了字典键的冗余if
else
。
答案 2 :(得分: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