2010-08-06 16 views
6

tengo una lista de números, por ejemploRealizar una acción de más de 2 y 2 elementos en una lista

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

me gustaría para calcular la diferencia entre los 2 y 2 artículos, (es decir, por encima de la datos Quiero calcular 45-34,33-20,16-13 y 12-3, ¿cuál es la forma de hacerlo de python?

Además, en términos más generales, ¿cómo debo aplicar una función a 2 y 2 de estos elementos, es decir, quiero llamar a myfunc(data[0],data[1]),myfunc(data[2],data[3]) y así sucesivamente sobre la lista.

Respuesta

6

Trate de cortar la lista:

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

o puede utilizar el hecho de que IZIP garantiza el orden en que se consume sus argumentos:

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

Puede crear su propio iterador para recorrer los elementos de dos en dos:

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) 

El iterador devuelve tuplas de dos elementos a la vez:

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

A continuación, puede utilizarlo para asignar su función:

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

+1 por elegancia .. –

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 

Requiere Python 2.6 o posterior. Tomé pairwise() de here.

+0

OP no quiere 'pairwise', sino' grouper'. – kennytm

+0

Agradable como código, aunque tiene una función diferente ya que tiene pares superpuestos. –

+0

Kenny, tienes toda la razó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))) 

El consumo de versión (datos serán quitado de la lista, así que tome copia si todavía es necesario), "sin comprensión".

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 

Yo utilizaría generalmente listas de comprensión y división, pero estas soluciones son a veces más comprensibles.

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

o el caso general

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

No es tan elegante como algunas de las otras soluciones tal vez. Todavía esto debería ser mencionado.

Cuestiones relacionadas