Supongamos que tengo una lista como esta, donde los números aumentan en diferentes pasos:
[ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]Quiero devolver el índice del primer elemento de la lista donde el aumento es incremental (+1 paso solamente). En este caso, 23 es la primera ubicación a partir de la cual el aumento se vuelve incremental, y su índice sería 8, que es lo que quiero como salida.
¿Cuál sería una manera simple y elegante de lograr esto? Esto es lo que he probado:
>>> for (a,b) in zip(l, l[1:]): ... if ba == 1: ... print(l.index(a)) ... breakACTUALIZACIÓN: en esta configuración en particular, una vez que el aumento se vuelve incremental, seguirá siendo así. Es posible que el aumento nunca llegue a ser incremental.
operator from operator import sub, indexOf L = [ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] print(indexOf(map(sub, L[1:], L), 1)) # prints 8 ValueError: sequence.index(x): x not in sequence si la diferencia 1 nunca ocurre, por lo que es posible que desee usar try / except por eso.
bisectEste solo toma el tiempo O (log n), usando la monotonicidad de la incrementalidad (como comentó "una vez que el aumento se vuelve incremental, seguirá siendo así" ).
from bisect import bisect L = [ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] class IsIncremental: def __getitem__(_, i): return L[i+1] - L[i] == 1 print(bisect(IsIncremental(), False, 0, len(L) - 1)) # prints 8 Imprime len(L) - 1 si la diferencia 1 nunca ocurre.
Como dice PEP 8 :
Nunca use los caracteres 'l' (letra minúscula el), [...] como nombres de variable de un solo carácter. En algunas fuentes, estos caracteres no se distinguen de los números uno y cero. Cuando tenga la tentación de usar 'l', use 'L' en su lugar.
Pasos:
Código:
my_list = [0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] for i in range(len(my_list)-1): if my_list[i+1] - my_list[i] == 1: print(i) breakResultado:
8
Haga un para cada ciclo y verifique el valor anterior con el actual. Una vez que llegue a un punto en el que su valor actual sea solo 1 mayor que el valor anterior, devuelva el índice del valor anterior en su matriz:
myList = [ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] lastVal = -1000 for i in myList: if i - lastVal == 1: print(myList.index(lastVal)) #will print your desired value's index. If this is in a function, replace print with return break lastVal = i if myList.index(lastVal) == len(myList) - 1: print("There is no incremental increase in your array")(editado, reemplazado return con lastVal, arreglado para imprimir el índice) Salida:
8