Grupuj kolejne rosnące liczby na liście [duplikat]
Jak mogę zgrupować kolejne, rosnące liczby całkowite na liście? Na przykład mam następującą listę liczb całkowitych:
numbers = [0, 5, 8, 3, 4, 6, 1]
Chciałbym pogrupować elementy w następujący sposób:
[[0, 5, 8], [3, 4, 6], [1]]
Podczas gdy następna liczba całkowita jest większa niż poprzednia, kontynuuj dodawanie do tej samej zagnieżdżonej listy; jedynki następna liczba całkowita jest mniejsza, dodaj zagnieżdżoną listę do głównej listy i zacznij od nowa.
Wypróbowałem kilka różnych sposobów (pętla while, pętla for, wyliczenie i zakres), ale nie mogę dowiedzieć się, jak dodać ją do tej samej zagnieżdżonej listy, o ile następna liczba całkowita jest większa.
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
Odpowiedzi
Możesz użyć pętli 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)
UWAGA: To nie jest używane .pop()
, więc numbers
lista pozostaje nienaruszona. Ponadto jedna pętla = złożoność czasowa O (N) !!
Gdyby pandy były dozwolone, zrobiłbym to:
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())]
produkuje
[[0, 5, 8], [3, 4, 6], [1]]
Możesz to zrobić:
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)
używaj pętli while i for. i dołącz je do drugiego wyniku i wyniku