2016-03-02 51 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