Gruppieren Sie fortlaufend steigende Zahlen in der Liste [doppelt]

Nov 24 2020

Wie kann ich aufeinanderfolgende aufsteigende Ganzzahlen in einer Liste zusammenfassen? Zum Beispiel habe ich die folgende Liste von ganzen Zahlen:

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

Ich möchte Elemente wie folgt zusammenfassen:

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

Während die nächste Ganzzahl größer als die vorherige ist, fügen Sie sie weiterhin derselben verschachtelten Liste hinzu. Wenn die nächste Ganzzahl kleiner ist, fügen Sie der Hauptliste eine verschachtelte Liste hinzu und beginnen Sie erneut.

Ich habe einige verschiedene Methoden ausprobiert (while-Schleife, for-Schleife, Aufzählung und Bereich), kann aber nicht herausfinden, wie sie an dieselbe verschachtelte Liste angehängt werden kann, solange die nächste Ganzzahl größer ist.

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

Antworten

8 megargayu Nov 24 2020 at 06:37

Sie könnten eine for-Schleife verwenden:

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)

HINWEIS: Dies wird nicht verwendet .pop(), sodass die numbersListe intakt bleibt. Auch eine Schleife = O (N) Zeitkomplexität !!

2 piterbarg Nov 24 2020 at 06:46

Wenn Pandas erlaubt sind, würde ich das tun:

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())]

produziert

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

Du kannst das:

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)

Verwenden Sie while und for-Schleifen. und hängen Sie sie an das zweite Ergebnis und Ergebnis an