[英]What is the pythonic way of setting fields of a dict in a list
我有兩個列表,一個包含 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
或者把它放在一個單線中:
for dic,val in zip(dicts,values): dic['a'] = val
請注意,與之前的代碼片段沒有區別。 這取決於你的眼睛最喜歡什么。
我們在這里更新字典:我們不創建副本等。這是一個重要的區別,因為可以引用給定字典的變量將反映我們所做的更改。
zip(..)
將一個序列或多個可迭代對象(這里是dicts
和values
)作為輸入,並生成這些可迭代對象的元素的元組。 所以它發出:
(values[0],dicts[0]), (values[1],dicts[1]), ...
現在我們進行元組解包:我們將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}]
為了 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
。
試試這個代碼:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.