2010-08-07 9 views
12

Tengo una lista de números enteros, es decir .:Encontrar el mayor delta entre dos números enteros en una lista en Python

values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80] 

Estoy tratando de encontrar la mayor diferencia entre dos números consecutivos. En este caso sería 15 de 64-> 79. Los números pueden ser negativos o positivos, aumentando o disminuyendo o ambos. Lo importante es que necesito encontrar el delta más grande entre dos números consecutivos.

¿Cuál es la forma más rápida de hacerlo? Estas listas pueden contener desde cientos hasta miles de enteros.

Editar: Este es el código que tengo en este momento:

prev_value = values[0] 
    largest_delta = 0 

    for value in values: 
      delta = value - prev_value 
      if delta > largest_delta: 
        largest_delta = delta 
      prev_value = value 

    return largest_delta 

¿Existe una manera más rápida de hacer esto? Se tarda un poco.

+1

Su código de error si los deltas son todas negativas; devuelve cero. –

Respuesta

21
max(abs(x - y) for (x, y) in zip(values[1:], values[:-1])) 
+2

para listas tan grandes, use 'itertools.izip' para evitar construir una lista de tuplas en la memoria – aaronasterling

+0

Eso es realmente hermoso :-) –

+1

Todavía no me puedo acostumbrar a este" nuevo "Ptyhon. ¿Qué pasó con mi hermoso lenguaje legible? :-) – paxdiablo

2

Trate de temporización algunos de estos con el módulo timeit:

>>> values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80] 
>>> max(values[i+1] - values[i] for i in xrange(0, len(values) - 1)) 
15 
>>> max(v1 - v0 for v0, v1 in zip(values[:-1], values[1:])) 
15 
>>> from itertools import izip, islice 
>>> max(v1 - v0 for v0, v1 in izip(values[:-1], values[1:])) 
15 
>>> max(v1 - v0 for v0, v1 in izip(values, islice(values,1,None))) 
15 
>>> 
2

Esto es más como un anuncio por la brillante recipes en ayuda del pitón itertools.

En este caso, use el par como se muestra en la ayuda vinculada anteriormente.

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) 

values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80] 

print max(b - a for a,b in pairwise(values)) 
2

con reduce (fea supongo)

>>> foo = [5, 5, 5, 5, 8, 8, 9]  
>>> print reduce(lambda x, y: (max(x[0], y - x[1]), y), foo, (0, foo[0]))[0] 
3 
Cuestiones relacionadas