Regrouper les nombres croissants consécutifs dans la liste [dupliquer]
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
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 numbers
liste reste intacte. Aussi, une boucle = complexité temporelle O (N) !!
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]]
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