Python | Haz una lista de intervalos con números secuenciales

Dada una lista de números secuenciales, escriba un programa en Python para convertir la lista dada en una lista de intervalos.

Ejemplos:

Input : [2, 3, 4, 5, 7, 8, 9, 11, 15, 16]
Output : [[2, 5], [7, 11], [15, 16]]

Input : [1, 2, 3, 6, 7, 8, 9, 10]
Output : [[1, 3], [6, 10]]

 
Método #1: enfoque ingenuo

Primero, usamos el enfoque de fuerza bruta para convertir la lista de números secuenciales en intervalos. Inicie un ciclo hasta la longitud de la lista. En cada iteración, utilice otro bucle para comprobar la continuidad de la secuencia. Tan pronto como la secuencia se detenga, produzca el límite inferior y superior de cada intervalo.

# Python3 program to Convert list of 
# sequential number into intervals
  
def interval_extract(list):
    length = len(list)
    i = 0
    while (i< length):
        low = list[i]
        while i <length-1 and list[i]+1 == list[i + 1]:
            i += 1
        high = list[i]
        if (high - low >= 1):
            yield [low, high]
        elif (high - low == 1):
            yield [low, ]
            yield [high, ]
        else:
            yield [low, ]
        i += 1
  
# Driver code
l =  [2, 3, 4, 5, 7, 8, 9, 11, 15, 16]
print( list(interval_extract(l)))
Producción:

[[2, 5], [7, 9], [11], [15, 16]]

 
Método #2: Pythonic Naive
Primero, ordene la lista dada. Inicializar número_anterior y inicio_de_rango con el primer elemento. Inicie un bucle y verifique si el siguiente número es aditivo del número anterior. En caso afirmativo, inicialice este número al número anterior; de lo contrario, produzca el nuevo intervalo que comienza con range_start y termina con previous_number .

# Python3 program to Convert list of 
# sequential number into intervals
  
def interval_extract(list):
    list = sorted(set(list))
    range_start = previous_number = list[0]
  
    for number in list[1:]:
        if number == previous_number + 1:
            previous_number = number
        else:
            yield [range_start, previous_number]
            range_start = previous_number = number
    yield [range_start, previous_number]
  
# Driver code
l = [2, 3, 4, 5, 7, 8, 9, 11, 15, 16]
print( list(interval_extract(l)))
Producción:

[[2, 5], [7, 9], [11, 11], [15, 16]]

 
Método #3: Usar itertools
El otro método pythonic es usar Python itertools. usamos itertools.groupby()_ Donde enumerate(iterable) se toma como iterable y lambda t: t[1] – t[0]) como función clave para encontrar la secuencia de intervalos.

# Python3 program to Convert list of 
# sequential number into intervals
import itertools
  
def intervals_extract(iterable):
      
    iterable = sorted(set(iterable))
    for key, group in itertools.groupby(enumerate(iterable),
    lambda t: t[1] - t[0]):
        group = list(group)
        yield [group[0][1], group[-1][1]]
  
# Driver code
l = [2, 3, 4, 5, 7, 8, 9, 11, 15, 16]
print( list(intervals_extract(l)))
Producción:

[[2, 5], [7, 9], [11, 11], [15, 16]]

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 *