1
votes

Python: le dernier index n'est pas en cours d'itération

Je travaille sur un problème où je reçois une liste de numéros en double et je dois renvoyer une nouvelle liste de toutes les valeurs uniques de la liste initiale.

Voici ma solution:

updated_list = []
for i in new_list:
   if i not in updated_list[]:
       updated_list.append(i)

Sortie: [1, 2, 3, 4] mais il manque le 5 de la nouvelle_liste.

De plus, je suis nouveau en python et je sais que je sais que je peux faire quelque chose comme

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
updated_lst = []
for i in range(0,len(new_list)-1):
    if new_list[i] != new_list[i+1]:
        updated_lst.append(new_list[i])
print(updated_lst)

Mais je me demandais comment puis-je faire ma solution initiale travailler.

Merci beaucoup


2 commentaires

Je voudrais simplement ajouter une vérification après la boucle for si le dernier élément n'est pas égal à l'avant-dernier et l'ajouter si c'est le cas. Le dernier élément n'est qu'un cas particulier qui ne peut pas être traité comme le reste.


Votre liste est-elle garantie d'être en ordre, lorsque vous la recevez? Parce que votre algorithme ne fonctionnera pas correctement si les nombres sont dans le désordre (considérez [1, 2, 1] ). Pour l'algorithme que vous utilisez, vous devez toujours inclure le dernier élément dans la liste d'entrée.


4 Réponses :


0
votes

Je suggère W3schools : pour ce problème, mais dans votre cas spécifique, voici comment je le ferais:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
new_list = list(dict.fromkeys(new_list))
print(new_list)

ouput: "[1, 2, 3, 4, 5]"

espérons que cela a aidé


3 commentaires

Je pense que set () au lieu de disct serait plus approprié dans ce cas


Oui, c'est vrai, mais dans tous les cas, il répond à la question et prend moins de lignes de code que de tentatives de code.


@ Edo98 note, list (set (new_list)) ne maintient pas l'ordre



0
votes

Je ne sais pas si votre problème vous oblige à parcourir la liste, mais vous pouvez facilement trouver tous les éléments uniques d'une liste en la convertissant en un ensemble . Vous pouvez ensuite récupérer une liste en convertissant cet ensemble en une list .

new_list = [1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5]
unique = set(new_list)
print(list(unique))

Renvoie:

[1, 2, 3, 4, 5]


3 commentaires

L'ordre de la liste imprimée n'est pas garanti. Si important, la "liste" doit être remplacée par "triée".


Convenu. Le demandeur n'a pas spécifié d'ordre mais si l'ordre est requis, trié peut certainement être utilisé.


Eh bien, trié n'est pas tout à fait correct, car trié renverra une liste triée pas une liste avec les éléments dans l'ordre d'origine, ce qui est perdu en utilisant set. En python moderne, les objets dict sont garantis de maintenir l'ordre, donc, list (dict.fromkeys (new_list)) fonctionne si vous voulez quelque chose de mignon.



2
votes

Votre problème est que la fonction intégrée range (N, M) va itérer de N à M - 1, vous ne devriez donc pas définir votre deuxième argument sur len (new_list) - 1 mais à len (new_list) .

Voir la référence ici .

Cela ne fera pas fonctionner votre première solution mais explique pourquoi vous n'obtenez pas votre dernier élément.

A déclaré que cette solution n'est pas optimale, la façon d'y parvenir en regardant manuellement les indices serait:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
updated_lst = []

for i in range(0,len(new_list)):
    found = False

    for j in range(0, len(updated_lst)):
        if new_list[i] == updated_lst[j]:
            found = True
            break

    if not found:
        updated_lst.append(new_list[i])

print(updated_lst)

Tout cela est bon pour apprendre mais je m'abstiendrai de l'utiliser à l'extérieur d'un terrain de jeu car il est inutilement complexe et inélégant.

Merci @ncasale d'avoir aidé à améliorer la réponse.

En remarque, votre premier algorithme ne supprimera pas les doublons mais seulement les répétitions. Une autre façon d'obtenir ce que vous voulez pourrait être list(set(new_list)).


2 commentaires

Itérer vers len (new_list) lancera une exception lorsque if new_list [i]! = New_list [i + 1]: est appelé.


En effet, mais c'est un mauvais algorithme, ne supprime pas les doublons.



0
votes

Ensemble est un type de données de collection non ordonné qui ne contient aucun élément en double . Pour la sortie souhaitée, nous pouvons convertir la liste donnée en un ensemble, ce qui supprimera tous les éléments en double. Ensuite, nous pouvons à nouveau le convertir en une liste. Comme suit:

[1, 2, 3, 4, 5]

Cela affichera la sortie comme suit:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
x=set(new_list)
print(list(x))

De cette façon, nous obtenons la liste sans aucun élément en double. J'espère que ça aide!


0 commentaires