Python元素方面的元组操作,如sum

Rod*_*igo 94 python tuples

反正有没有让Python中的元组操作像这样工作:

>>> a = (1,2,3)
>>> b = (3,2,1)
>>> a + b
(4,4,4)
Run Code Online (Sandbox Code Playgroud)

代替:

>>> a = (1,2,3)
>>> b = (3,2,1)
>>> a + b
(1,2,3,3,2,1)
Run Code Online (Sandbox Code Playgroud)

我知道它的工作原理是这样的,因为这些__add____mul__方法的定义是这样的.那么唯一的方法就是重新定义它们吗?

iro*_*ggy 130

import operator
tuple(map(operator.add, a, b))
Run Code Online (Sandbox Code Playgroud)

  • `tuple([item1 + item2 for item1,item2 in zip(a,b)])`将等同于列表理解. (21认同)
  • @AdamParkin,生成器理解甚至更好`元组(item1 + item2 for item1,item2 in zip(a,b))`. (10认同)
  • 我会说这是最pythonic的解决方案. (4认同)
  • 除了map()是半弃用的.有关Guido的文章,请参阅http://www.artima.com/weblogs/viewpost.jsp?thread=98196,其中提到了如何将地图更好地编写为列表理解. (3认同)

Tri*_*ych 105

使用所有内置插件..

tuple(map(sum, zip(a, b)))
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但技术上不是要求的,因为map返回一个列表,而不是一个元组......所以:`tuple(map(sum,zip(a,b))` (15认同)
  • 语法是神秘的. (3认同)
  • 这似乎是更简单,更好的答案。为什么不接受? (2认同)
  • 这一个的好处是您可以将其扩展为:`tuple(map(sum(zip,zip(a,b,c)))` (2认同)

小智 30

此解决方案不需要导入:

tuple(map(lambda x, y: x + y, tuple1, tuple2))
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案也比其他无需导入的单线解决方案更快(`map(sum,zip(a,b))`) (2认同)

Dan*_*ana 20

排序结合前两个答案,对ironfroggy的代码进行调整,以便返回一个元组:

import operator

class stuple(tuple):
    def __add__(self, other):
        return self.__class__(map(operator.add, self, other))
        # obviously leaving out checking lengths

>>> a = stuple([1,2,3])
>>> b = stuple([3,2,1])
>>> a + b
(4, 4, 4)
Run Code Online (Sandbox Code Playgroud)

注意:使用self.__class__而不是stuple简化子类化.


小智 17

from numpy import *

a = array( [1,2,3] )
b = array( [3,2,1] )

print a + b
Run Code Online (Sandbox Code Playgroud)

array([4,4,4]).

请参阅http://www.scipy.org/Tentative_NumPy_Tutorial

  • 这样可以工作,但是为了简单的加法操作导入numpy有点重. (5认同)

Jae*_*eom 10

可以使用生成器理解来代替地图.内置的地图功能并不过时,但对于大多数人而言,它比列表/生成器/字典理解的可读性低,因此我建议不要使用地图功能.

tuple(p+q for p, q in zip(a, b))
Run Code Online (Sandbox Code Playgroud)


小智 6

没有返回元组的类定义的简单解决方案

import operator
tuple(map(operator.add,a,b))
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 6

所有发电机解决方 不确定性能(尽管itertools很快)

import itertools
tuple(x+y for x, y in itertools.izip(a,b))
Run Code Online (Sandbox Code Playgroud)


Let*_*zee 6

甚至更简单,无需使用地图,您就可以做到这一点

>>> tuple(sum(i) for i in zip((1, 2, 3), (3, 2, 1)))
(4, 4, 4)
Run Code Online (Sandbox Code Playgroud)