什么是在列表中设置字典的字段的pythonic方法

时间:2017-01-30 14:11:14

标签: python list dictionary data-structures

我有两个列表,一个包含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的做法是什么?

3 个答案:

答案 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(..)将序列或更多迭代(此处为dictsvalues)作为输入,并生成这些迭代元素的元组。所以它发出:

(values[0],dicts[0]), (values[1],dicts[1]), ...

现在我们执行 tuple-unpacking :我们将valdicvaluesdicts中的一个统一起来。因此,对于每个元组,我们设置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