Je suis novice en Python et mon devoir est de prendre une liste avec un tas de chiffres et
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 Réponses :
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]
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
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] .
j == 0 , les numbers[j] == 1 donc nous ne le sautons pas, et incrémentons j .j == 1 , les numbers[j] == 3 donc nous supprimons l'élément 1 et incrémentons j . La liste est maintenant [1, 3, 7] .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.
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)
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
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 += 1sous unelse. 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!