2017-01-30 16 views
3

我有兩個表,一個包含int類型:什麼是在列表中設置一個字典領域的Python的方式

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}] 

我想要從值列表中獲取第一個值,並將第一個字典的字段「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做到這一點的方法?

+1

什麼?他們的價值觀將保持0嗎? –

+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]), ... 

現在我們做元組拆包:我們統一valdicvalues之一和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}] 
+6

真的,不要誤認爲它帶來某種好處,不要把它放在一條線上。它不是。 – chepner

+0

@chepner:對於Python解析器來說,就我所知,完全沒有區別。但它更緊湊。 –

+1

非常感謝您的答覆。這確實是我正在尋找的。 –

1

對於Python的一個班輪的緣故(雖然我強烈建議你喜歡威廉對清晰的答案/可讀性):

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}] 

編輯:刪除用於字典密鑰的冗餘ifelse

+0

請注意,這將使詞典的**副本**。這可能是一個重要的區別,因爲引用*舊*字典的其他變量不會反映這些更改。 (我不是說這是一個問題,但它可能值得注意)。 –

+0

@StefanPochmann我只是看着那個...有點多餘,是嗎?感謝您指出。 – blacksite

0

試試這個代碼:關於`B`和`C`鍵

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 
相關問題