簡體   English   中英

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

[英]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(..)將一個序列或多個可迭代對象(這里是dictsvalues )作為輸入,並生成這些可迭代對象的元素的元組。 所以它發出:

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

現在我們進行元組解包:我們將valdic與其中一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM