Python 添加元组以生成每个';列';

Python 添加元组以生成每个';列';,python,tuples,Python,Tuples,将两个或多个元组的值相加以生成每个“列”的总和的最符合Python的方式是什么 例如: 到目前为止,我考虑了以下几点: def sumtuples(*tuples): return (sum(v1 for v1,_ in tuples), sum(v2 for _,v2 in tuples)) >>> print sumtuples(a, b, c) (51, 73) 我敢肯定,这离理想还差得远——如何改进呢?如果元组集相对较小,那么解决方案也不错。但是,如果你要处

将两个或多个元组的值相加以生成每个“列”的总和的最符合Python的方式是什么

例如:

到目前为止,我考虑了以下几点:

def sumtuples(*tuples):
    return (sum(v1 for v1,_ in tuples), sum(v2 for _,v2 in tuples))

>>> print sumtuples(a, b, c)
(51, 73)

我敢肯定,这离理想还差得远——如何改进呢?

如果元组集相对较小,那么解决方案也不错。但是,如果你要处理非常大的数据集,你应该考虑使用Read,因为它只会重复一次在列表中,与原来的两个元组列表重复两次。
>>> a = (10, 20)
>>> b = (40, 50)
>>> c = (1, 3)
>>> values=[a,b,c]
>>> reduce(lambda x,y: (x[0]+y[0],x[1]+y[1]), values,(0,0))
(51, 73)

我想你可以使用
reduce
,尽管这是否是pythonic还有争议

In [13]: reduce(lambda s, t: (s[0]+t[0], s[1]+t[1]), [a, b, c], (0, 0))
Out[13]: (51, 73)
这里有另一种使用
map
zip
的方法:

In [14]: map(sum, zip(a, b, c))
Out[14]: [51, 73]
或者,如果要将元组集合作为列表传入:

In [15]: tups = [a, b, c]

In [15]: map(sum, zip(*tups))
Out[15]: [51, 73]
并且,使用列表理解而不是
映射

In [16]: [sum(z) for z in zip(*tups)]
Out[16]: [51, 73]

不是纯Python,而是安装了SciPy的首选方式:

from scipy import array
a = array((10, 20))
b = array((40, 50))
c = array((1, 3))

print tuple(a+b+c)

既然我们快疯了

a = (10, 20)
b = (40, 50)
c = (1, 3)

def sumtuples(*tuples):
   return map(sum, zip(*tuples))

sumtuples(a,b,c)
[51, 73]

事实是,几乎每次我发布这些疯狂的解决方案时,“天真”的方法似乎都会更快、更具可读性……

这些解决方案都会遇到以下两个问题之一:

  • 它们只在两列上工作;((1,2,3)、(2,3,4)、(3,4,5))不起作用;或
  • 它们在迭代器上不起作用,因此生成10亿行不起作用(或者浪费大量内存)
不要以得不到正确答案为代价陷入“pythonic”的流行语中

def sum_columns(it):
    result = []
    for row in it:
        if len(result) <= len(row):
            extend_by = len(row) - len(result)
            result.extend([0] * extend_by)

        for idx, val in enumerate(row):
            result[idx] += val

    return result

a = (1, 20)
b = (4, 50)
c = (0, 30, 3)
print sum_columns([a,b,c])

def generate_rows():
    for i in range(1000):
        yield (i, 1, 2)

lst = generate_rows()
print sum_columns(lst)
def sum_列(it):
结果=[]
对于其中的行:

如果len(结果)是什么?对我来说,这似乎是一个相当好的解决方案。它在迭代器上不起作用,所以如果你要添加一百万行,这是浪费,而且它对于正好两列是特殊情况。你在使用什么来给你那些提示->In[15]:Out[15]:@Chris:ipython:--太好了,我推荐得太多了!我同意,除非OP要处理大量的元组,否则发布的解决方案是好的。我有点喜欢这些“疯狂”的线程作为学习我不懂的语言的一种方式。是的,readable在编写代码时总是赢(或者应该赢)。但是,使用拉链真的那么疯狂吗?阅读代码给我的印象是它相当地道。@ars:我想zip可能很常见。我认为是我在大学里对Java的灌输让我认为tuple类应该有一个add()方法。或者在运算符重载的语言中,+运算符应处理此问题。当然,当map/sum/zip工作正常时,这意味着要对tuple进行子类化。但是应该由哪个类负责,是数据结构还是使用数据结构的类?每本书和在线资源都选择了不同的方面。。。更轻松的是,我同意,这些疯狂的线程也是我最喜欢的。@Selinap:reduce在Python 3中,但它被移到了“functools”模块。您可能对它感兴趣。Pythonic和correct;)
def sum_columns(it):
    result = []
    for row in it:
        if len(result) <= len(row):
            extend_by = len(row) - len(result)
            result.extend([0] * extend_by)

        for idx, val in enumerate(row):
            result[idx] += val

    return result

a = (1, 20)
b = (4, 50)
c = (0, 30, 3)
print sum_columns([a,b,c])

def generate_rows():
    for i in range(1000):
        yield (i, 1, 2)

lst = generate_rows()
print sum_columns(lst)