Je souhaite rechercher les plus grands nombres consécutifs dans une liste et les ajouter à une nouvelle liste.
ma_liste = [97, 98, 97, 98, 99, 97, 98, 97]
J'ai essayé d'utiliser la boucle while mais lorsqu'elle est incrémentée, elle n'ajoute pas de nombres.
final_list = [] j = 0 while j < (len(my_list) - 1): if my_list[j] + 1 == my_list[j + 1]: final_list.append(my_list[j]) final_list.append(my_list[j + 1]) j += 2 else: j += 1 print(final_list)
La sortie attendue doit être final_list = [97,98,99]
Mais ma sortie est
final_list = [97,98]
3 Réponses :
Vous pouvez utiliser des groupes_ consécutifs
du module more_itertools
:
import more_itertools as mit my_list = [97, 98, 97, 98, 99, 97, 98, 97] print(max([list(group) for group in mit.consecutive_groups(my_list)], key=len)) # [97, 98, 99]
Exemple :
XXX
Remarque : Comme il s'agit d'un module tiers, vous devez l'installer avant d'essayer -Â pip install more_itertools.
Voici une solution sans outil externe:
my_list = [97, 98, 97, 1, 2, 100, 98, 99, 97, 98, 97]; #sort list max to min my_list.sort(reverse = True) # take largest number as starting point last_item = my_list[0] new_list = [last_item] # loop through list for every item to assure that we dont stop too soon for i in range(len(my_list)): for number in my_list: # compare the current number with the last number inserted to new_list # if its smaller we add it to the list and update the last item if number == last_item-1: new_list.append(number) last_item = number print(new_list)
Veuillez noter que ce n'est probablement pas la manière la plus efficace de le faire.
Trouvez les indices où la différence entre les éléments consécutifs ! = 1
en utilisant np.where
et np.diff
(renvoie un tuple, récupérez le premier élément du tuple qui est un tableau d'indices), ajoutez 1
à chaque élément pour obtenir les points de terminaison pour np.split
.
Trouvez le plus grand tableau de la liste résultante en utilisant max(list,key=len)
>>> import numpy as np >>> my_list = [97, 98, 97, 98, 99, 97, 98, 97] >>> max(np.split(my_list,np.where(np.diff(my_list) != 1)[0]+1),key=len) array([97, 98, 99])
Vous aurez probablement un autre problème si vous commencez par un nombre qui n'est pas le plus petit (par exemple [100, 97, ...] ou si vous ajoutez [..., 1,2, ..] quelque part entre les deux car votre code vérifie uniquement si j et j + 1 de la liste d'origine sont consécutifs. Vous devez comparer les valeurs de ma_liste à la dernière valeur de nouvelle_liste pour obtenir une liste consécutive. Mais alors vous avez toujours un problème si votre premier numéro ne l'est pas le plus petit donc vous devez d'abord trouver le plus petit nombre pour obtenir le vrai point de départ. Cela devient assez compliqué si vous voulez extraire plusieurs nombres consécutifs.