Agrupar números crecientes consecutivos en la lista [duplicado]

Nov 24 2020

¿Cómo puedo agrupar números enteros crecientes consecutivos en una lista? Por ejemplo, tengo la siguiente lista de números enteros:

numbers = [0, 5, 8, 3, 4, 6, 1]

Me gustaría agrupar elementos de la siguiente manera:

[[0, 5, 8], [3, 4, 6], [1]]

Si bien el siguiente entero es más que el anterior, siga agregando a la misma lista anidada; unos, el siguiente entero es más pequeño, agregue la lista anidada a la lista principal y comience de nuevo.

He intentado algunas formas diferentes (while loop, for loop, enumerate y range), pero no puedo averiguar cómo hacer que se agregue a la misma lista anidada siempre que el siguiente entero sea más grande.

result = []

while (len(numbers) - 1) != 0:
    group = []

    first = numbers.pop(0)
    second = numbers[0]

    while first < second:
        group.append(first)
        
        if first > second:
            result.append(group)
        break

Respuestas

8 megargayu Nov 24 2020 at 06:37

Podrías usar un bucle for:

numbers = [0, 5, 8, 3, 4, 6, 1]
result = [[]]
last_num = numbers[0] # last number (to check if the next number is greater or equal)
for number in numbers:
    if number < last_num:
        result.append([]) # add a new consecutive list
    result[-1].append(number) 
    last_num = number # set last_num to this number, so it can be used later
print(result)

NOTA: Esto no se usa .pop(), por lo que la numberslista permanece intacta. Además, ¡un bucle = complejidad de tiempo O (N)!

2 piterbarg Nov 24 2020 at 06:46

Si se permiten pandas, haría esto:

import pandas as pd
numbers = [0, 5, 8, 3, 4, 6, 1]
df = pd.DataFrame({'n':numbers})
[ g['n'].values.tolist() for _,g in df.groupby((df['n'].diff()<0).cumsum())]

produce

[[0, 5, 8], [3, 4, 6], [1]]
1 ppwater Nov 24 2020 at 06:47

Puedes hacerlo:

numbers = [0, 5, 8, 3, 4, 6, 1]
result = []
while len(numbers) != 0:
    secondresult = []
    for _ in range(3):
        if numbers != []:
            toappend = numbers.pop(0)
            secondresult.append(toappend)
        else:
            continue
    result.append(secondresult)
print(result)

utilizar bucles while y for. y agregarlos al segundo resultado y al resultado