Regrouper les nombres croissants consécutifs dans la liste [dupliquer]

Nov 24 2020

Comment puis-je regrouper des entiers croissants consécutifs dans une liste? Par exemple, j'ai la liste suivante d'entiers:

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

Je souhaite regrouper les éléments comme suit:

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

Alors que le prochain entier est plus grand que le précédent, continuez à ajouter à la même liste imbriquée; si l'entier suivant est plus petit, ajoutez la liste imbriquée à la liste principale et recommencez.

J'ai essayé plusieurs façons différentes (boucle while, boucle for, énumération et plage), mais je ne peux pas comprendre comment l'ajouter à la même liste imbriquée tant que l'entier suivant est plus grand.

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

Réponses

8 megargayu Nov 24 2020 at 06:37

Vous pouvez utiliser une boucle 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)

REMARQUE: cela n'utilise pas .pop(), donc la numbersliste reste intacte. Aussi, une boucle = complexité temporelle O (N) !!

2 piterbarg Nov 24 2020 at 06:46

Si les pandas sont autorisés, je ferais ceci:

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

produit

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

Tu peux le faire:

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)

utilisez les boucles while et for. et ajoutez-les au second résultat et au résultat