2011-04-09 15 views
5

साथ जोड़ने के लिए मैं इस तरह छद्म कोड है:कैसे tuples

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

मैं अजगर में यह लिखना चाहते हैं। लेकिन पाइथन जोड़ों को जोड़ सकते हैं? ऐसा कुछ कोड करने का सबसे अच्छा तरीका क्या है?

उत्तर

10

क्या आप तत्व-वार जोड़ना चाहते हैं, या tuples को जोड़ना चाहते हैं? डिफ़ॉल्ट अजगर तक करता

(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 x, y में izip (xs, ys))'। – delnan

+0

बिल्कुल मैं 'myadd' की तरह कुछ करना चाहता हूं यह सबसे अच्छा तरीका है? – fpointbin

+0

हां, और डेलनान की टिप्पणी अधिक गंदी है। – highBandWidth

12

मैं

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

या, और अधिक स्वाभाविक रूप से के लिए जाना चाहते हैं कार्य करें:

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

काम करता है - लेकिन छोटे कोड के लिए numpy आयात करने के लिए overkill हो सकता है। – jitter

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

highBandWidth से जवाब देने के लिए इसके विपरीत, इस दृष्टिकोण की आवश्यकता है कि पाइथन 2.7 या इससे पहले की तरह, एक टाइपरर को बढ़ाने के बजाय tuples एक ही लंबाई के हो। पायथन 3, map में थोड़ा अलग है, इसलिए परिणाम a और b के छोटे के बराबर लंबाई के साथ रकम का एक गुच्छा है।

आप अजगर 2 में काट-छांट व्यवहार चाहते हैं, आप itertools.imap साथ map की जगह ले सकता:

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

शैली खोदना है लेकिन एक और आयात की आवश्यकता है। – jitter

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 >) आदि मोर इन विशेष ऑपरेटरों पर ई जानकारी मिल सकती है उदा। here (numeric operations) और here (comparisions)

आप अभी भी मूल टपल इसके अलावा फोन करके tuples संलग्न कर सकते हैं: tuple.__add__(a,b) बजाय a+b। या ऐसा करने के लिए नई कक्षा में append() फ़ंक्शन को परिभाषित करें।

संबंधित मुद्दे