我有这样的伪代码:
if( b < a)
return (1,0)+foo(a-b,b)
我想用python编写它。但python可以添加元组吗?编写类似代码的最佳方法是什么?
答案 0 :(得分:12)
我会去
>>> map(sum, zip((1, 2), (3, 4)))
[4, 6]
或更自然地:
>>> numpy.array((1, 2)) + numpy.array((3, 4))
array([4, 6])
答案 1 :(得分:11)
你想做元素添加,还是附加元组?默认情况下,python会
(1,2)+(3,4) = (1,2,3,4)
您可以将自己定义为:
def myadd(x,y):
z = []
for i in range(len(x)):
z.append(x[i]+y[i])
return tuple(z)
此外,正如@ delnan的评论所表明的那样,这更好地写成
def myadd(xs,ys):
return tuple(x + y for x, y in izip(xs, ys))
或甚至更多功能:
myadd = lambda xs,ys: tuple(x + y for x, y in izip(xs, ys))
然后做
if( b < a) return myadd((1,0),foo(a-b,b))
答案 2 :(得分:2)
tuple(map(operator.add, a, b))
与highBandWidth的答案相反,这种方法要求元组在Python 2.7或更早版本中具有相同的长度,而不是引发TypeError。在Python 3中,map
略有不同,因此结果是总和的元组,其长度等于a
和b
的较短者。
如果您想在Python 2中使用截断行为,可以将map
替换为itertools.imap
:
tuple(itertools.imap(operator.add, a, b))
答案 3 :(得分:2)
如果您希望+
本身以这种方式行事,您可以继承tuple
并覆盖添加:
class mytup(tuple):
def __add__(self, other):
if len(self) != len(other):
return NotImplemented # or raise an error, whatever you prefer
else:
return mytup(x+y for x,y in izip(self,other))
同样适用于__sub__
,__mul__
,__div__
,__gt__
(元素>
)等。有关这些特殊运营商的更多信息,例如: here (numeric operations)和here (comparisions)
您仍然可以通过调用原始元组添加来追加元组:tuple.__add__(a,b)
而不是a+b
。或者在新类中定义append()
函数来执行此操作。