Python: la Suppression des négatifs à partir d'une liste de nombres
La question est de supprimer les négatifs de nombres.
Quand remove_negs([1, 2, 3, -3, 6, -1, -3, 1])
est exécutée, le résultat est: [1, 2, 3, 6, -3, 1]
. Le résultat est supposé être [1, 2, 3, 6, 3, 1]
. ce qui se passe, c'est que si il y a deux nombres négatifs dans une ligne (par exemple, -1, -3
) puis le deuxième numéro sera pas supprimé.
def main():
nombre = input("Entrez une liste de nombres: ")
remove_negs(nombre)
def remove_negs(num_list):
'''Remove the negative numbers from the list num_list.'''
for item in num_list:
if item < 0:
num_list.remove(item)
print num_list
main()
Sonne comme une bonne job pour une compréhension de liste qui vérifie val >= 0.
Ne pas supprimer des éléments à partir d'une liste que vous itération sur que des que des variations de l'index des articles et vous pouvez vous retrouver à sauter sur certains éléments.
Comme les autres ont dit, ne pas changer le contenu du conteneur de données pendant que vous êtes à parcourir. Itérer sur une copie de l'élément dans la liste(num_list):
Aussi, vous ne devez pas appeler
Ne pas supprimer des éléments à partir d'une liste que vous itération sur que des que des variations de l'index des articles et vous pouvez vous retrouver à sauter sur certains éléments.
Comme les autres ont dit, ne pas changer le contenu du conteneur de données pendant que vous êtes à parcourir. Itérer sur une copie de l'élément dans la liste(num_list):
Aussi, vous ne devez pas appeler
remove
pour supprimer un élément lorsque vous savez déjà où il est. C'est (un) qui sont potentiellement mauvais, parce que remove
supprime le premier élément égal à item
, qui peut ne pas être celui que vous voulez, et (b) la lenteur, car cela signifie que vous avez à la recherche à toute la liste pour trouver le produit même si vous avez déjà un savait où il était. del num_list[index]
est toujours la meilleure. Mais comment savez-vous de l'index? Simple: for index, item in enumerate(num_list):
. (Ceci est une note de côté; il ne résolvent pas votre problème... mais il y a déjà de bonnes réponses et commentaires.)OriginalL'auteur user3161743 | 2014-01-06
Vous devez vous connecter pour publier un commentaire.
C'est généralement une mauvaise idée de supprimer des éléments d'une liste lors de l'itération (voir le lien dans mon commentaire pour une explication de pourquoi il en est ainsi). Une meilleure approche serait d'utiliser un compréhension de liste:
Avis que la ligne ci-dessus crée un nouveau liste et ayants droit
num_list
. Vous pouvez aussi faire une "place" affectation de la formequi n'est pas de créer une nouvelle liste dans la mémoire, mais au lieu de cela modifie l'emplacement mémoire déjà pointé par
num_list
. Cette différence est expliquée plus en détail ici.num_list
ici, de sorte que la version originale (sans la tranche d'affectation) est probablement l'amende. Peut-être qu'il serait encore mieux de présenter et d'expliquer la différence?Oui, peut-être que vous avez raison. Je vais modifier pour expliquer la différence.
Vous avez dit "Le résultat est supposé être
[1, 2, 3, 6, 3, 1]
." C'est exactement ce que arshajii du code produit. Si vous le faisiez à la façon dont vous êtes en prétendant vouloir, le résultat serait[1, 2, 3, 3, 6, 1, 3, 1]
.OriginalL'auteur arshajii
Beaucoup plus simple:
Si vraiment vous ne voulez boucle, essayez ceci:
Ce fait ce que vous voulez:
La clé est que l'instruction d'affectation
r = num_list[:]
fait une copie de num_list. Afin de ne pas confondre la boucle, Nous avons ensuite supprimer des éléments der
plutôt qu'à partir de la liste nous sommes en boucle.Plus: Python traitement des variables est un peu subtile. Python conserve les noms de variables, comme
r
ounum_list
séparé de données variables, telles que[1, 2, 3, 6, 1]
. Les noms ne sont que des pointeurs vers les données. Considérons l'instruction d'affectation:Après cette instruction est exécutée,
r
etnum_list
à la fois pour les mêmes données. Si vous faites un changement àr
de données de l', vous êtes également un changement d'num_list
de données de l'parce qu'ils pointent vers le même de données. Maintenant, pensez à:Cette instruction indique à python pour modifier
num_list
de données de l'pour ne prendre que certains de ses éléments. De ce fait, python fait une copie denum_list
's de données. Il se trouve que[:]
spécifie que nous voulons tous denum_list
de données de l'inchangée, mais qui ne l'empêche pas de python à en faire une copie. La copie est attribué àr
. Cela signifie quer
etmum_list
pointent désormais à différents de données. Nous pouvons apporter des modifications àr
de données de l'et il n'a pas d'incidence surnum_list
de données de l'parce qu'ils ont différents de données.Si cela est nouveau pour vous, vous pouvez jeter un oeil à ce tutoriel sur python approche pour les noms de variables et de données variables: La compréhension de Python variables et Gestion de la Mémoire
Exemples:
Contraste avec:
Bonne question. Voir mise à jour de réponse.
OriginalL'auteur John1024
Une autre solution
OriginalL'auteur sergiohzlz
À partir d'un commentaire sur arshajii réponse:
Supprimant les nombres négatifs est exactement ce que votre code est clairement en train de faire, et c'est aussi la seule façon d'obtenir le résultat souhaité:
Mais si vous voulez vraiment à "supprimer les signes négatifs" à partir des chiffres, c'est encore plus facile. Par exemple, pour supprimer le signe négatif de
-3
, vous venez de le nier et obtenir3
, droit? Vous pouvez faire cela en place, comme dans votre code existant:... ou dans une compréhension de liste, comme dans arshajii:
Et c'est encore plus facile avec le
abs
fonction, ce qui est exactement ce que fait—nie de nombres négatifs, les feuilles positive et zéro seul:De toute façon, bien sûr, cela vous donnera
[1, 2, 3, 3, 6, 1, 3, 1]
, qui est la mauvaise réponse... mais si votre commentaire est correct, c'est la réponse que vous avez demandé.OriginalL'auteur abarnert
Autres la la classique
variable operator non-variable
Essayer quelques yoda conditions trop =)OriginalL'auteur alvas
de bande que le nombre de leurs signes négatifs, c'est la meilleure chose à faire
par exemple
imprime
OriginalL'auteur Hiskel Kelemework
Je pense que une solution élégante peut être comme ceci:
OriginalL'auteur Amjad