2010-08-06 2 views
6

У меня есть список номеров, скажемВыполнить действие над 2 и 2-х элементов в списке

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

Я хотел бы, чтобы вычислить разницу между 2 и 2 пунктов (то есть, для выше data Я хочу вычислить 45-34,33-20,16-13 и 12-3, что такое способ python?

Кроме того, в более общем плане, как применить функцию к 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) 

Итератор возвращает кортеж из двух элементов, в то время:

>>> 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 

Требуется Python 2.6 или более поздней версии. Я взял pairwise() от here.

+0

OP не хочет 'попарно', а' 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] 

Не так элегантно, как некоторые из других решений, может быть. Тем не менее это следует упомянуть.

Смежные вопросы