Python 2.7 jette ValueError: liste.supprimer(x): x n'est pas dans la liste
Chaque fois que je lance ce programme, j'obtiens cette erreur:
ValueError: list.remove(x): x not in list
Je suis en train d'abaisser la santé d'un seul alien chaque fois qu'il est frappé par un éclair. Que seul étranger devraient également être détruite si sa santé est <= 0
. De même, le boulon seraient également détruites. Voici mon code:
def manage_collide(bolts, aliens):
# Check if a bolt collides with any alien(s)
for b in bolts:
for a in aliens:
if b['rect'].colliderect(a['rect']):
for a in aliens:
a['health'] -= 1
bolts.remove(b)
if a['health'] == 0:
aliens.remove(a)
# Return bolts, aliens dictionaries
return bolts, aliens
La ValueError
qui se passe sur la ligne aliens.remove(a)
. Juste pour clarifier, à la fois la aliens
et bolts
sont des listes de dictionnaires.
Ce que je fais mal?
ValueError sur quelle ligne ?
les étrangers.supprimer(un)
Pour référence future, le problème avec ce code, c'est que j'en boucle sur les étrangers de liste à deux reprises, ce qui provoque certains problèmes lorsque vous essayez de supprimer de la liste. Le retrait de la seconde "pour un dans aliens" permettrait d'éviter ce problème.
les étrangers.supprimer(un)
Pour référence future, le problème avec ce code, c'est que j'en boucle sur les étrangers de liste à deux reprises, ce qui provoque certains problèmes lorsque vous essayez de supprimer de la liste. Le retrait de la seconde "pour un dans aliens" permettrait d'éviter ce problème.
OriginalL'auteur Remington Thurber | 2013-01-02
Vous devez vous connecter pour publier un commentaire.
Vous ne devez pas supprimer des éléments d'une liste, vous êtes en boucle. Créer une copie à la place:
et
De la modification d'une liste en bouclant sur elle, affecte la boucle:
Supprimer des éléments d'une liste, vous êtes en boucle de plus de deux fois rend les choses un peu plus compliquées encore, résultant en une ValueError:
Lors de la création d'une copie de la liste que vous modifiez à chaque niveau de vos boucles, vous évitez le problème:
Lorsque vous avez une collision, il vous suffit de retirer le
b
boulon une fois, pas dans la boucle où vous blesser les étrangers. Nettoyer les étrangers séparément plus tard:Il met toujours un ValueError sur la même ligne étrangers.supprimer(a) lors d'un changement seule cette ligne à une liste de copie.
C'est le double de la boucle, il est d'autant plus amusant et peut conduire à l'erreur de valeur.
Cela ne fonctionne toujours pas pour moi. Vous pourriez peut-être modifier directement mon code?
OriginalL'auteur Martijn Pieters
Il y a un bug dans votre code qui est à l'origine. Votre code simplifié, ressemble:
Qui est à l'origine de vous faire une boucle sur
aliens
plusieurs fois pour chaque entrée dansb
. Si le b est supprimé sur la première boucle suraliens
puis, quand il passe en boucle sur un second temps, vous allez y arriver erreur.Quelques petites choses à corriger. Tout d'abord, le changement à l'intérieur de la boucle sur les
aliens
utiliser autre chose quea
, donc:Deuxième, seulement supprimer
b
debolts
une fois. donc:Il y a d'autres problèmes avec ce code, ainsi, je pense, mais qui est la cause de votre problème principal. Martijn post peut également aider.
OriginalL'auteur dave mankoff
Donner les boulons de "santé" ainsi, initialisé à 1. Ensuite, vous pouvez faire une boucle imbriquée pour le calcul de tous les dommages, et de deux désemboîtées "boucles" pour supprimer tout ce qui est "morte". Sauf, ne le faites pas tout à fait comme ça, parce que vous ne voulez pas modifier la liste de ce que vous êtes en boucle. De faire une copie est encore trop compliqué. Ce que vous voulez vraiment, c'est directement construire une nouvelle liste uniquement de la toujours "en vie" choses, et vous pouvez le faire de manière descriptive avec des interprétations de la liste (ou comme ici, avec
filter
).OriginalL'auteur Karl Knechtel