2010-08-06 32 views
6

liste halinde 2 ve 2 elemanları üzerinde bir işlem gerçekleştirmeYukarıda için, yani (Ben 2 ve 2 parça arasındaki farkı hesaplamak istiyorum, ben numaralarının listesi var

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

demek data 45-34,33-20,16-13 ve 12-3 hesaplamak istiyorum, bunu yapmanın python yöntemi nedir?

Ayrıca, daha genel olarak, bir işlevi 2 ve 2'ye nasıl uygulamalıyım? bu unsurlar, yani ben liste üzerinde böyle devam myfunc(data[0],data[1]),myfunc(data[2],data[3]) arayıp istiyorum.

cevap

6

dilimleme listesini deneyin:

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

veya izip onun argümanları tüketir sırayı garanti gerçeğini kullanabilirsiniz: versiyonunu tüketmek

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

Sen oluşturabilir

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) 

yineleyici bir anda iki elemanlarının dizilerini verir:

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

Sonra işlevini harita için kullanabilirsiniz: Kendi yineleyici elemanları iki tarafından iki tekrarlatacak

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

+1 şıklık için .. –

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 

Python 2.6 veya daha sonraki gerektirir. here'dan pairwise()'u aldım.

+0

OP, 'pairwise' istemiyor, ancak' grouper'. – kennytm

+0

Üst üste binen çiftler gibi farklı işlevler olsa da kod olarak güzel. –

+0

Kenny, kesinlikle haklısın. – 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))) 

(veri olacak listeden kaldırıldı, bu yüzden hala gerekiyorsa, kopyala), "anlamadan". Ben kullanacağı

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 

genellikle comprehensions ve dilimleme listelemek, ancak bu çözümler belki bazen daha anlaşılabilir.

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

veya genel durum

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

kadar zarif değil belki diğer çözümlerden bazıları. Yine de bu belirtilmelidir.

İlgili konular