Python | Encuentra grupos de números estrictamente crecientes en una lista

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))
Producción:

[[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)))
Producción:

[[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)))
Producción:

[[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)))
Producción:

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *