Eine Minute s'il te plaît, Ich eine hap
kleine Problemo avec diese Religione.
-- Eddie Izzard (faire son impression
de Martin Luther)
La suppression par la rétro-itérer sur une liste de préserver l'itérateur est une solution commune à ce problème. Mais une autre solution est de changer cela en un problème différent. Au lieu de supprimer des éléments de la liste à l'aide de certains critères (dans votre cas, l'index existe en une liste d'index seront supprimés), créer une nouvelle liste qui laisse de côté les éléments en cause.
L[:]=[ item for i,item in enumerate(L)if i notin I ]
Pour cette question, où as-tu venir avec l'index dans I en premier lieu? Vous pouvez combiner la logique de l'obtention de l'index pour être enlevé et la construction de la nouvelle liste. En supposant que c'est une liste d'objets et que vous souhaitez seulement à garder ceux qui passent un isValid test:
L[:]=[ item for item in L if item.isValid()]
C'est beaucoup plus simple que l':
I = set()for i in range(len(L)):ifnot L[i].isValid():
I.add(i)for i in sorted(I, reverse=True):del L[i]
Pour la plupart, je me tourne toute question au sujet de "la façon de supprimer à partir d'une liste d'éléments que je ne veux pas de" dans "comment créer une nouvelle liste contenant seulement les éléments que je veux".
MODIFICATION: modifié "L = ..." à "L[:] = ..." par Alex Martelli, en réponse à cette question.
9
for i in I:del L[i]
ne fonctionne pas, parce que (selon la commande), vous pouvez invalider l'itérateur -- ce se présentent généralement comme des articles qui vous l'intention de supprimer restant dans la liste.
Il est toujours plus sûr de supprimer des éléments de la liste dans l'ordre inverse de leurs indices. La façon la plus simple de le faire est avec triés():
for i in sorted(I, reverse=True):del L[i]
4
Vous pouvez utiliser numpy.delete comme suit:
import numpy as np
a =['a','l',3.14,42,'u']
I =[1,3,4]
np.delete(a, I).tolist()# Returns: ['a', '3.14']
Si vous n'avez pas l'esprit de se retrouver avec un numpy tableau à la fin, vous pouvez laisser de côté la .tolist(). Vous devriez voir quelques très grandes améliorations de la vitesse, trop, ce qui en fait une solution plus évolutive. Je n'ai pas comparé, mais numpy opérations sont compilées en code écrit en C ou Fortran.
1
Si votre liste initiale des données peuvent en toute sécurité être transformé en un ensemble (c'est à dire toutes les valeurs uniques et n'a pas besoin de maintenir l'ordre), vous pouvez également utiliser les opérations sur les ensembles:
Lset= set(L)
newset =Lset.difference(I)
Vous pourriez aussi peut-être faire quelque chose avec un Sac/Multiset, mais il n'est probablement pas la peine de l'effort. Paul McGuire deuxième listcomp solution est certainement le meilleur pour la plupart des cas.
La suppression par la rétro-itérer sur une liste de préserver l'itérateur est une solution commune à ce problème. Mais une autre solution est de changer cela en un problème différent. Au lieu de supprimer des éléments de la liste à l'aide de certains critères (dans votre cas, l'index existe en une liste d'index seront supprimés), créer une nouvelle liste qui laisse de côté les éléments en cause.
Pour cette question, où as-tu venir avec l'index dans
I
en premier lieu? Vous pouvez combiner la logique de l'obtention de l'index pour être enlevé et la construction de la nouvelle liste. En supposant que c'est une liste d'objets et que vous souhaitez seulement à garder ceux qui passent unisValid
test:C'est beaucoup plus simple que l':
Pour la plupart, je me tourne toute question au sujet de "la façon de supprimer à partir d'une liste d'éléments que je ne veux pas de" dans "comment créer une nouvelle liste contenant seulement les éléments que je veux".
MODIFICATION: modifié "L = ..." à "L[:] = ..." par Alex Martelli, en réponse à cette question.
ne fonctionne pas, parce que (selon la commande), vous pouvez invalider l'itérateur -- ce se présentent généralement comme des articles qui vous l'intention de supprimer restant dans la liste.
Il est toujours plus sûr de supprimer des éléments de la liste dans l'ordre inverse de leurs indices. La façon la plus simple de le faire est avec triés():
Vous pouvez utiliser
numpy.delete
comme suit:Si vous n'avez pas l'esprit de se retrouver avec un
numpy
tableau à la fin, vous pouvez laisser de côté la.tolist()
. Vous devriez voir quelques très grandes améliorations de la vitesse, trop, ce qui en fait une solution plus évolutive. Je n'ai pas comparé, maisnumpy
opérations sont compilées en code écrit en C ou Fortran.Si votre liste initiale des données peuvent en toute sécurité être transformé en un ensemble (c'est à dire toutes les valeurs uniques et n'a pas besoin de maintenir l'ordre), vous pouvez également utiliser les opérations sur les ensembles:
Vous pourriez aussi peut-être faire quelque chose avec un Sac/Multiset, mais il n'est probablement pas la peine de l'effort. Paul McGuire deuxième listcomp solution est certainement le meilleur pour la plupart des cas.