将元组的iterable转换为每个元素的iterable(Python)

将元组的iterable转换为每个元素的iterable(Python),python,python-3.x,iterable,generator-expression,Python,Python 3.x,Iterable,Generator Expression,我有一个iterabledelta,它生成两个数的元组(dx,dy),我想计算每个数的总和。由于在第一次迭代后处理了delta,因此以下操作不起作用 x = sum(dx for dx, dy in delta) y = sum(dy for dx, dy in delta) 有什么想法吗?我正在考虑以某种方式将delta转换为dx和dy的两个iterables,但迄今为止没有取得任何进展。使用zip()和map()函数在每列上应用sum(): x, y = map(sum, zip(*del

我有一个iterable
delta
,它生成两个数的元组
(dx,dy)
,我想计算每个数的总和。由于在第一次迭代后处理了
delta
,因此以下操作不起作用

x = sum(dx for dx, dy in delta)
y = sum(dy for dx, dy in delta)
有什么想法吗?我正在考虑以某种方式将
delta
转换为
dx
dy
的两个iterables,但迄今为止没有取得任何进展。

使用
zip()
map()
函数在每列上应用
sum()

x, y = map(sum, zip(*delta))
这应该做到

ysum = 0
xsum = 0

for dx, dy in delta:
    xsum += dx
    ysum += dy

发电机的想法是,你可以一次用完它,那么为什么不一次完成所有的数学运算呢?

解决方案非常好。但是一个简单的问题是:
zip(*delta)
是否会完全消耗
delta
,并立即将整个内容加载到内存中?@Lingxi不是用Python-3,而是用Python-2
zip
返回一个列表。在Python-2中,应该使用
itertools.izip()
。我认为
zip()
不会立即使用它,但
*delta
会使用它。没有?只是把它扔出去(作为一个相当奇怪的选项…,但似乎是可行的):
sum((计数器({'a':a,'b':b})对于a,b在d中,Counter())
当然
a,b=reduce(lambda a,b:[a[0]+b[0],a[1]+b[1]),d)
可以直接进行迭代和存储,而不是依赖于解包,但这并不是最好的可读性。。。这个问题和你的有关,也看看这个。