2016-03-02 52 views
2

我有兩個列表L1和L2。 L1中的每個唯一元素是在第二個列表L2中具有值的鍵。我想創建一個字典,其中的值是L2中與L1中的同一個鍵關聯的元素的總和。創建密鑰來自列表的字典,值是另一個列表中相應元素的總和

我做了以下,但我不是很自豪的代碼。有沒有簡單的pythonic方法來做到這一點?

L = [2, 3, 7, 3, 4, 5, 2, 7, 7, 8, 9, 4] # as L1 
W = range(len(L)) # as L2 

d = { l:[] for l in L } 
for l,w in zip(L,W): d[l].append(w) 
d = {l:sum(v) for l,v in d.items()} 

編輯:

問:我怎麼知道哪些L2的元素相關聯的L1給定的關鍵要素?

答:如果它們具有相同的索引。例如,如果元素7在L1中重複3次(例如L1 [2] == L1 [7] == L1 [8] = 7),那麼我希望鍵7的值爲L2 [2] + L2 [7] + L2 [8]

+1

您如何知道L2的哪些元素與L1的給定關鍵元素相關聯? – eguaio

+0

@eguaio如果它們具有相同的索引。例如,如果元素7在L1中重複3次(例如L1 [2] == L1 [7] == L1 [8] = 7),那麼我希望鍵7的值爲L2 [2] + L2 [7] + L2 [8] – eLearner

回答

5

可以有序的,而你遍歷列表使用enumerate()來獲取項目的索引,並使用collections.defaultdict()(通過將int,因爲它是將0先進行評估缺少功能時間)保存的物品,並添加值,而遇到重複鍵:

>>> from collections import defaultdict 

>>> d = defaultdict(int) 
>>> for i,j in enumerate(L): 
...  d[j]+=i 
... 
>>> d 
defaultdict(<type 'int'>, {2: 6, 3: 4, 4: 15, 5: 5, 7: 17, 8: 9, 9: 10}) 
2

如果你不需要的list S中的中間dict可以使用collections.Counter

import collections 
L = [2, 3, 7, 3, 4, 5, 2, 7, 7, 8, 9, 4] # as L1 
W = range(len(L)) # as L2 

d2 = collections.Counter() 
for i, value in enumerate(L): 
    d2[value] += i 

其行爲像一個正常的字典:

Counter({2: 6, 3: 4, 4: 15, 5: 5, 7: 17, 8: 9, 9: 10}) 
+1

更新了答案,以顯示''counter'優於'defaultdict'的優點。 – MSeifert

+0

最後一個表達式不會產生與您首先提供的解決方案相同的結果。 W [i]將不會成爲總和,它將成爲相應鍵的W中的最後一個值。 – eLearner

+0

是的,我也注意到在你評論之前不久,我會看看我是否可以修復它。 – MSeifert

1

希望這可以幫助你。

L = [2, 3, 7, 3, 4, 5, 2, 7, 7, 8, 9, 4] # as L1 
dict_a = dict.fromkeys(set(L),0) 
for l,w in enumerate(L):  
    dict_a[w] = int(dict_a[w]) + l