2010-08-06 10 views
6

Mam listę numerów, powiedzmyWykonywanie czynności ponad 2 i 2 elementy na liście

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

Chciałbym obliczyć różnicę między 2 a 2 pozycji, (czyli dla powyższego dane Chcę obliczyć 45-34,33-20,16-13 i 12-3, co to jest sposób python?

Ponadto, bardziej ogólnie, jak powinienem zastosować funkcję do 2 i 2 te elementy, czyli chcę nazwać myfunc(data[0],data[1]),myfunc(data[2],data[3]) itd.

Odpowiedz

6

Spróbuj krojenie listę:

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

lub można skorzystać z faktu, że iZIP gwarantuje porządek, w którym zużywa swoje argumenty:

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

Można tworzyć własny iterator iteracyjne nad elementami dwa-dwa:

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) 

Iterator zwraca krotki z dwóch elementów naraz:

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

Wtedy można go używać do mapowania swoją funkcję:

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

+1 dla elegancji .. –

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 

wymaga Pythona 2.6 lub później. Wziąłem pairwise() z here.

+0

OP nie chce "pairwise", ale 'grouper'. – kennytm

+0

Miły jako kod, choć ma inną funkcję niż nakładające się pary. –

+0

Kenny, masz absolutną rację. – 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))) 

spożywania wersję (dane będą usunięty z listy, więc weź kopię, jeśli nadal potrzebujesz), "bez zrozumienia".

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 

Używałbym ogólnie rozumienia listowego i krojenia, ale rozwiązania te są być może czasem bardziej zrozumiałe.

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

lub ogólny przypadek

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

Nie tak eleganckie, jak w niektórych innych rozwiązań może. Nadal należy o tym wspomnieć.

Powiązane problemy