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