2010-08-06 18 views
6

मैं नंबरों की सूची है में 2 और 2 तत्वों से अधिक कोई क्रिया निष्पादित करें, कहनाएक सूची

data = [45,34,33,20,16,13,12,3] 

मैं 2 और 2 आइटम के बीच के अंतर का परिकलन करना चाहते हैं, (जो है, इसके बाद के संस्करण के लिए डेटा मैं 45-34,33-20,16-13 और 12-3 की गणना करना चाहता हूं, ऐसा करने का पाइथन तरीका क्या है?

इसके अलावा, आमतौर पर, मुझे 2 और 2 में फ़ंक्शन कैसे लागू करना चाहिए इन तत्वों, यानी, मैं myfunc(data[0],data[1]),myfunc(data[2],data[3]) पर कॉल करना चाहता हूं और इसलिए सूची में।

उत्तर

6

सूची टुकड़ा करने की क्रिया का प्रयास करें:

from itertools import izip 
[myfunc(a, b) for a, b in izip(data[::2], data[1::2])] 

या आप तथ्य यह है कि izip जिस क्रम में यह अपने तर्कों की खपत की गारंटी देता है का उपयोग कर सकते हैं:

idata = iter(data) 
[myfunc(a, b) for a, b in izip(idata, idata)] 
2

आप बना सकते हैं

class myiter(object): 
    def __iter__(self): 
     return self 
    def next(self): 
     a = self.l.next() 
     b = self.l.next() 
     return (a, b) 
    def __init__(self, l): 
     self.l = iter(l) 

इटरेटर एक समय में दो तत्वों की tuples रिटर्न:

>>> for x, y in i(data): 
...  print x, y 
45 34 
33 20 
16 13 
12 3 

तो फिर तुम इसके ज़रिये अपने समारोह मैप करने के लिए: अपनी खुद की इटरेटर तत्वों दो-दर-दो से अधिक तेज़ी से दोहराने में

>>> [myfunc(x, y) for x, y in myiter(data)] 
+0

लालित्य के लिए +1 .. –

1
from itertools import tee,izip 

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

for a,b in pairwise(data): 
    print a-b 

अजगर 2.6 या बाद की आवश्यकता है। मैंने pairwise()here से लिया।

+0

ओपी 'pairwise' नहीं चाहता, लेकिन' grouper'। – kennytm

+0

कोड के रूप में अच्छा है, हालांकि अलग-अलग फ़ंक्शन जैसे ओवरलैपिंग जोड़े हैं। –

+0

केनी, आप बिल्कुल सही हैं। – loevborg

2
def pairs(iterable): 
    while iterable: 
     yield next(iterable),next(iterable) 

data = [45,34,33,20,16,13,12,3] 
print "With pairs generator" 
print ','.join(str(a-b) for a,b in pairs(iter(data))) 

उपभोक्ता संस्करण (डेटा हो जाएगा सूची से हटा दिया गया है, इसलिए यदि आवश्यक हो तो प्रतिलिपि लें), "समझ के बिना"।

print 'By simple list pop way' 
data_c = data[:] 
result=[] 
while data_c: result.append(data_c.pop(0)-data_c.pop(0)) 
print result 

मैं आमतौर पर सूची की समझ और टुकड़ा करने का उपयोग करता हूं, लेकिन ये समाधान शायद कभी-कभी अधिक समझ में आते हैं।

1
diffs = [data[i] - data[i+1] for i in range(0, len(data), 2)] 

या सामान्य मामले

pairs = [(data[i], data[i+1]) for i in range(0, len(data), 2)] 
results = [myfunc(*p) for p in pairs] 

के रूप में सुंदर नहीं अन्य समाधान हो सकता है में से कुछ के रूप में। फिर भी इसका उल्लेख किया जाना चाहिए।

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