元组列表的列表,按元素求和
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)]
您可以使用 zip
和 sum
做一些更长时间的事情,但如果您还没有使用 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 的了。
我有一个元组列表列表。每个内部列表包含 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)]
您可以使用 zip
和 sum
做一些更长时间的事情,但如果您还没有使用 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 的了。