Dada una lista de enteros, escriba un programa en Python para encontrar grupos de números estrictamente crecientes.
Ejemplos:
Input : [1, 2, 3, 5, 6] Output : [[1, 2, 3], [5, 6]] Input : [8, 9, 10, 7, 8, 1, 2, 3] Output : [[8, 9, 10], [7, 8], [1, 2, 3]]
Enfoque n. ° 1: ingenuo pythonico
Este es un enfoque ingenuo que utiliza un espacio de lista de entrada adicional. Hace uso de un ciclo for y en cada iteración, verifica si el siguiente elemento se incrementa desde el anterior en 1. En caso afirmativo, agréguelo a la sublista actual; de lo contrario, cree otra sublista.
# Python3 program to Find groups # of strictly increasing numbers within def groupSequence(lst): res = [[lst[0]]] for i in range(1, len(lst)): if lst[i-1]+1 == lst[i]: res[-1].append(lst[i]) else: res.append([lst[i]]) return res # Driver program l = [8, 9, 10, 7, 8, 1, 2, 3] print(groupSequence(l))
[[8, 9, 10], [7, 8], [1, 2, 3]]
Enfoque n.º 2: alternativa ingenua
Esta es una alternativa al enfoque ingenuo mencionado anteriormente. Este método es bastante simple y directo. Construye una lista enlazada al comienzo y una lista enlazada al final , que contiene la posición de la secuencia inicial y final de números enteros crecientes. Por lo tanto, simplemente devuelva los límites usando bucles for.
# Python3 program to Find groups # of strictly increasing numbers within def groupSequence(l): start_bound = [i for i in range(len(l)-1) if (l == 0 or l[i] != l[i-1]+1) and l[i + 1] == l[i]+1] end_bound = [i for i in range(1, len(l)) if l[i] == l[i-1]+1 and (i == len(l)-1 or l[i + 1] != l[i]+1)] return [l[start_bound[i]:end_bound[i]+1] for i in range(len(start_bound))] # Driver program l = [8, 9, 10, 7, 8, 1, 2, 3] print(list(groupSequence(l)))
[[8, 9, 10], [7, 8], [1, 2, 3]]
Enfoque #3: Usar iterable y yield
Este enfoque usa otra lista ‘res’ y un iterable ‘it’. Se usa una variable ‘prev’ para mantener el registro del entero anterior y start se usa para obtener la posición inicial de la secuencia creciente. Usando un ciclo, en cada iteración, verificamos si el elemento de inicio es un sucesor de anterior o no. En caso afirmativo, lo agregamos a res; de lo contrario, simplemente entregamos res + [anterior] como elemento de lista.
# Python3 program to Find groups # of strictly increasing numbers within def groupSequence(x): it = iter(x) prev, res = next(it), [] while prev is not None: start = next(it, None) if prev + 1 == start: res.append(prev) elif res: yield list(res + [prev]) res = [] prev = start # Driver program l = [8, 9, 10, 7, 8, 1, 2, 3] print(list(groupSequence(l)))
[[8, 9, 10], [7, 8], [1, 2, 3]]
Enfoque n.º 4: uso de itertools
Python itertools proporciona operaciones como ciclo y grupo que se utilizan en este método. Primero formamos otra lista ‘ temp_list ‘ usando ciclo. El ciclo genera una serie de valores que se repite infinitamente. Luego agrupamos temp_list en consecuencia usando la operación groupby y finalmente obtenemos el resultado deseado.
# Python3 program to Find groups # of strictly increasing numbers within from itertools import groupby, cycle def groupSequence(l): temp_list = cycle(l) next(temp_list) groups = groupby(l, key = lambda j: j + 1 == next(temp_list)) for k, v in groups: if k: yield tuple(v) + (next((next(groups)[1])), ) # Driver program l = [8, 9, 10, 7, 8, 1, 2, 3] print(list(groupSequence(l)))
[(8, 9, 10), (7, 8), (1, 2, 3)]
Publicación traducida automáticamente
Artículo escrito por Smitha Dinesh Semwal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA