创建字典,其中键来自列表,值是另一个列表中相应元素的总和

时间:2016-03-02 13:19:09

标签: python list dictionary

我有两个列表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的给定关键元素相关联?

A:如果它们具有相同的索引。例如,如果元素7在L1中重复3次(例如L1 [2] == L1 [7] == L1 [8] = 7),那么我希望键7的值为L2 [2] + L2 [7] + L2 [8]

3 个答案:

答案 0 :(得分: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})

答案 1 :(得分:2)

如果您不需要dict的中间list,则可以使用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})

答案 2 :(得分: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