2

给定一个列表字典

vd = {'A': [1,0,1], 'B':[-1,0,1], 'C':[0,1,1]}

我想明智地添加列表元素。所以我想将列表 A 中的第一个元素添加到列表 B 的第一个元素,反之亦然,复杂性在于您不能依赖标签是 A、B、C。它可以是任何东西。其次,字典的长度也是可变的。这里是 3。但可能是 30。

我需要的结果是一个列表 [0, 1, 3]

4

3 回答 3

9

所以你只想按元素加起来所有的值?

[sum(l) for l in zip(*vd.values())]

于 2013-07-21T21:38:30.793 回答
4

简而言之:

>>> map(sum, zip(*vd.values()))
[0, 1, 3]

解释

给定一本字典:

>>> vd = {'A': [1,0,1], 'B': [-1,0,1], 'C': [0,1,1]}

我们可以得到值

>>> values = vd.values()
>>> values
[[1, 0, 1], [-1, 0, 1], [0, 1, 1]]

然后将它们拉上拉链

>>> zipped = zip(*values)
>>> zipped
[(1, -1, 0), (0, 0, 1), (1, 1, 1)]

请注意,zip压缩每个参数;它不需要一个东西的列表来压缩。因此,我们需要将*列表解包为参数。

如果我们只有一个列表,我们可以将它们相加

>>> sum([1, 2, 3])
6

但是,我们有多个,所以我们可以映射它:

>>> map(sum, zipped)
[0, 1, 3]

全部一起:

>>> map(sum, zip(*vd.values()))
[0, 1, 3]

扩展到平均值而不是总和

这种方法也很容易扩展;例如,我们可以很容易地对其元素进行平均而不是求和。为此,我们首先创建一个average函数:

def average(numbers):
    # We have to do the float(...) so it doesn't do an integer division.
    # In Python 3, it is not necessary.
    return sum(numbers) / float(len(numbers))

然后只需替换sumaverage

>>> map(average, zip(*vd.values()))
[0.0, 0.3333, 1.0]
于 2013-07-21T21:40:45.320 回答
1
vd = {'A': [1,0,1], 'B':[-1,0,1], 'C':[0,1,1]}
vd_keys = list(vd.keys())
rt = vd[vd_keys.pop()].copy() # copy otherwise rt and vd[vd_keys.pop()] will get synced
for k in vd_keys:
    for i in range(len(rt)):
        rt[i] += vd[k][i]

print(rt)
于 2013-07-21T21:44:58.537 回答