Agrupar números crecientes consecutivos en la lista [duplicado]
¿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
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)!
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]]
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