2
votes

Liste Python: comment la commander et se débarrasser des doublons

Je suis novice en Python et mon devoir est de prendre une liste avec un tas de chiffres et

  1. faire la liste ordonnée du plus petit nombre au plus élevé
  2. se débarrasser des numéros en double.

Cela doit être accompli avec des boucles

Mon code jusqu'à présent:

[65, 66, 69, 72, 73, 78, 79, 79, 81, 82, 83, 84, 84, 84, 85]

Et la sortie:

numbers = [84, 79, 66, 69, 79, 82, 78, 79, 84, 84, 79, 66, 69, 84,
           72, 65, 84, 73, 83, 84, 72, 69, 81, 85, 69, 83, 84, 73, 79, 78]
ordered = []
while numbers != []:
    min = numbers[0]
    for i in range(0, len(numbers)):
        if numbers[i] < min:
            min = numbers[i]
    ordered.append(min)
    j = 0
    while j < len(numbers):
        if numbers[j] == min:
            numbers.pop(j)
        j += 1
print(ordered)

La tâche 1 est donc correcte, mais la tâche 2 n'est accomplie qu'à certains moments, pas tous. Je ne comprends pas pourquoi? Merci d'avance pour toute aide! PS: J'ai déjà résolu le problème d'une autre manière, mais cela ne cesse de me demander pourquoi cette idée publiée n'a pas fonctionné.


4 commentaires

pourquoi pas simplement sorted(set(numbers)) .


FWIW, et je sais que vous ne l'avez pas demandé, mais ordered = sorted(set(numbers)) résoudra cela en une seule ligne de code.


Mettez j += 1 sous un else . Lorsque vous faites apparaître un élément, vous ne voulez pas incrémenter l'index car un doublon aurait pu glisser à sa place.


Merci c'était ça!


4 Réponses :


-1
votes

set supprimera les doublons

sorted le triera

sorted(list(set([65, 66, 69, 72, 73, 78, 79, 79, 81, 82, 83, 84, 84, 84, 85])))
[65, 66, 69, 72, 73, 78, 79, 81, 82, 83, 84, 85]


2 commentaires

sorted() peut également prendre un set comme paramètre, donc list() peut être omis.


Lisez la question. L'OP doit utiliser la boucle pour atteindre son objectif



3
votes

D'autres ont fourni des moyens plus courts et plus efficaces de le faire, mais vous avez spécifiquement demandé ce qui ne va pas avec votre approche. Le problème est dans ce bit:

    j = 0
    while j < len(numbers):
        if numbers[j] == min:
            numbers.pop(j)
        else:
            j += 1

Que se passe-t-il si min se produit deux fois consécutivement? Disons par exemple que min == 3 , et la liste est [1, 3, 3, 7] .

  • Pour j == 0 , les numbers[j] == 1 donc nous ne le sautons pas, et incrémentons j .
  • Pour j == 1 , les numbers[j] == 3 donc nous supprimons l'élément 1 et incrémentons j . La liste est maintenant [1, 3, 7] .
  • Pour j == 2 , les numbers[j] == 7 pour ne pas le faire éclater, et c'est fini.

Oups! Nous avons sauté le deuxième 3 car il a reculé d'une position lorsque nous avons fait sauter son prédécesseur, tandis que j avançait d'une position en même temps.

La solution est de n'incrémenter j si nous n'avons rien supprimé, car nous devons revérifier l'élément à la position j après avoir supprimé son prédécesseur:

    j = 0
    while j < len(numbers):
        if numbers[j] == min:
            numbers.pop(j)
        j += 1

Vérifions que la boucle est toujours garantie de se terminer. À chaque itération, soit j devient plus grand, soit len(numbers) devient plus petit, donc finalement ils se rencontreront et j < len(numbers) devient faux. Donc nous sommes bons.


0 commentaires

1
votes

Vous pouvez utiliser le tri par bulles (si vous avez besoin d'une autre méthode de tri, remplacez-la simplement)

[65, 66, 69, 72, 73, 78, 79, 81, 82, 83, 84, 85]

Le résultat:

numbers = [84, 79, 66, 69, 79, 82, 78, 79, 84, 84, 79, 66, 69, 84,
    72, 65, 84, 73, 83, 84, 72, 69, 81, 85, 69, 83, 84, 73, 79, 78]

def bubble_sort(arr):
    n = len(arr)
    for i in range(n-1):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1] :
                arr[j], arr[j+1] = arr[j+1], arr[j]
    no_dub = []
    for i in arr:
        if i not in no_dub:
            no_dub.append(i)
    return no_dub
bubble_sort(numbers)


0 commentaires

1
votes

Vous avez besoin d'un petit ajout:

    while j < len(numbers):
    if numbers[j] == min:
        numbers.pop(j)
        j -= 1             #increment should not advance if you pop a number
    j += 1

Alors ça fonctionnera


0 commentaires