2011-04-09 55 views
5

添加我的僞代碼:如何使用元組

if(b < a) 
    return (1,0)+foo(a-b,b) 

我想將它用Python語言編寫。但是,python可以添加元組嗎?編寫類似代碼的最佳方式是什麼?

回答

10

你想做元素明智的添加,或追加元組?默認情況下,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)) 
+4

'tuple(x + y for x,y in izip(xs,ys))''。 – delnan 2011-04-09 19:40:26

+0

正是我想要做'myadd'這樣的事情是最好的方式嗎? – fpointbin 2011-04-09 19:45:54

+0

是的,而且delnan的評論更精闢。 – highBandWidth 2011-04-09 19:46:51

12

我會去

>>> map(sum, zip((1, 2), (3, 4))) 
[4, 6] 

,或者更自然:

>>> numpy.array((1, 2)) + numpy.array((3, 4)) 
array([4, 6]) 
+0

工程 - 但不得不導入numpy可能是小編碼矯枉過正。 – jitter 2017-01-23 17:24:18

2
tuple(map(operator.add, a, b)) 

相較於通過高帶寬的答案,這種方法要求元組在Python 2.7或更早版本中具有相同的長度,反而會引發TypeError。在Python 3中,map略有不同,因此結果是一個長度等於ab中較短的和的元組。

如果你想在Python 2截斷行爲,你可以用itertools.imap替代map

tuple(itertools.imap(operator.add, a, b)) 
+0

做挖掘的風格,但確實需要另一個導入。 – jitter 2017-01-23 17:22:57

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__(elementwise >)等等。Mor可以找到關於這些特殊操作員的信息,例如here (numeric operations)here (comparisions)

您仍然可以通過調用原始元組添加來附加元組:tuple.__add__(a,b)而不是a+b。或者在新類中定義一個append()函數來執行此操作。