küpe

2011-04-09 12 views
5

ile nasıl eklenir böyle sözde kod var: Python bunu yazmak istiyorumküpe

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

. Ama python tuplleri ekleyebilir mi? Böyle bir şeyi kodlamanın en iyi yolu nedir?

cevap

10

Eleman ekli ekleme yapmak mı yoksa tuplleri eklemek mi istiyorsunuz? Bu daha iyi daha

def myadd(xs,ys): 
    return tuple(x + y for x, y in izip(xs, ys)) 

veya olarak yazılır, @ delnan 'in yorumları açıkça yapar gibi,

def myadd(x,y): 
    z = [] 
    for i in range(len(x)): 
     z.append(x[i]+y[i]) 
    return tuple(z) 

Ayrıca: Varsayılan piton By

(1,2)+(3,4) = (1,2,3,4) 

Sen olarak kendi tanımlayabilir yapar işlevsel olarak:

myadd = lambda xs,ys: tuple(x + y for x, y in izip(xs, ys)) 

Sonra

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

'tuple (x + y için x, y'de izip (xs, ys))'. – delnan

+0

tam olarak 'myadd' gibi bir şey yapmak istiyorum bu en iyi yoldur? – fpointbin

+0

Evet, ve delnan’ın yorumu daha çirkin. – highBandWidth

12

I veya, daha doğal

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

için gider yapın:

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

işleri - fakat numpy içe aktarmak zorunda olmak, küçük kodlar için aşırı olabilir. – jitter

2
highBandWidth tarafından cevap aksine
tuple(map(operator.add, a, b)) 

, bu yaklaşım gerektirir tuple'lar Python 2.7 veya daha önceki bir sürümde aynı uzunlukta olmalı, bunun yerine bir TypeError'u yükseltmek. Python 3'te, map, biraz farklıdır, böylece sonuç, a ve b'un daha kısa olan uzunluğa eşit bir toplam sayısıdır. Eğer bu şekilde hareket etmek + kendisi istiyorsanız tuple alt sınıfı olabilir,

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

stili kazmak ama başka bir ithalat gerektirir. – jitter

2

ve ek geçersiz: Eğer Python 2'de kesilme davranış istiyorsanız

, sen itertools.imap ile map yerini alabilir

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__ için aynı şey geçerli (elementwise >) vb Mor Bu özel operatörler hakkındaki bilgi, örn. here (numeric operations) ve here (comparisions)

Hala orijinal tanımlama grubu eklenmesini arayarak dizilerini ekleyebilirsiniz: tuple.__add__(a,b) yerine a+b. Veya bunu yapmak için yeni sınıfta bir append() işlev tanımlayın.