Grupuj kolejne rosnące liczby na liście [duplikat]

Nov 24 2020

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

8 megargayu Nov 24 2020 at 06:37

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 numberslista pozostaje nienaruszona. Ponadto jedna pętla = złożoność czasowa O (N) !!

2 piterbarg Nov 24 2020 at 06:46

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]]
1 ppwater Nov 24 2020 at 06:47

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