元组列表的列表,按元素求和

List of lists of tuples, sum element-wise

我有一个元组列表列表。每个内部列表包含 3 个元组,每个元组有 2 个元素:

[
[(3, 5), (4, 5), (4, 5)],
[(7, 13), (9, 13), (10, 13)],
[(5, 7), (6, 7), (7, 7)]
]

我需要得到一个包含 3 个元组的列表,将所有这些元素“垂直”相加,如下所示:

(3, 5),  (4, 5),  (4, 5)
 +  +     +  +     +  +  
(7, 13), (9, 13), (10, 13)
 +  +     +  +     +  +  
(5, 7),  (6, 7),  (7, 7)
  ||       ||       ||
[(15, 25), (19, 25), (21, 25)]

因此,例如,结果列表中的第二个元组由初始列表中第二个元组的总和给出

(4+9+6, 5+13+7) = (19, 25)

我正在尝试 list/tuple 理解,但我对此有点迷茫。

你可以用 numpy 很容易地做到这一点。在轴 0 上使用总和。

import numpy as np

l = [
[(3, 5), (4, 5), (4, 5)],
[(7, 13), (9, 13), (10, 13)],
[(5, 7), (6, 7), (7, 7)]
]


[tuple(x) for x in np.sum(l,0)]

输出

[(15, 25), (19, 25), (21, 25)]

您可以使用 zipsum 做一些更长时间的事情,但如果您还没有使用 numpy 则不需要对 numpy 的重量级依赖。

>>> [tuple(sum(v) for v in zip(*t)) for t in zip(*x)]
[(15, 25), (19, 25), (21, 25)]

外层的zip将相应的元组配对在一起;内部 zip 将这些元组的相应元素配对在一起进行加法。

您可以使用纯 python 代码来完成此操作。

lst = [
[(3, 5), (4, 5), (4, 5)],
[(7, 13), (9, 13), (10, 13)],
[(5, 7), (6, 7), (7, 7)]
]

lst2 = []
for a in range(len(lst[0])):
    l = []
    for i in range(len(lst)):
        l.append(lst[i][a])
    lst2.append(l)
output = []
for a in lst2:
    t = [0 for a in range(len(lst[0][0]))]
    for i in range(len(a)):
        for z in range(len(a[i])):
            t[z]+= a[i][z]
    output.append(tuple(t))
print(output)

如果您更改列表,则它可以正常工作。

输出

IN:
lst = [
[(3, 5), (4, 5), (4, 5)],
[(7, 13), (9, 13), (10, 13)],
[(5, 7), (6, 7), (7, 7)]
]

OUT:
[(15, 25), (19, 25), (21, 25)]


IN:
lst = [
[(3, 5,2), (4, 5,3), (4, 5,1)],
[(7, 13,1), (9, 13,3), (10, 13,3)],
[(5, 7,6), (6, 7,3), (7, 7,7)]
]


OUT:
[(15, 25, 9), (19, 25, 9), (21, 25, 11)]

data = [
    [(3, 5), (4, 5), (4, 5)],
    [(7, 13), (9, 13), (10, 13)],
    [(5, 7), (6, 7), (7, 7)]
]

result = [tuple(sum(x) for x in zip(*t)) for t in zip(*data)]

print(result)

这是一个 one-liner,我认为没有比这更 pythonic 的了。