En Python remove()
supprimera la première occurrence de valeur dans une liste.
Comment supprimer toutes les occurrences d'une valeur d'une liste?
Voici ce que j'ai en tête:
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
Approche fonctionnelle:
Python 3.x
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]
ou
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]
Python 2.x
>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]
[y for y in x if y != 2]
__ne__
. La comparaison de deux valeurs est un processus beaucoup plus complexe que le simple appel__eq__
ou l'__ne__
une d'elles. Cela peut fonctionner correctement ici car vous ne comparez que des nombres, mais dans le cas général, c'est incorrect et un bug.Vous pouvez utiliser une liste de compréhension:
la source
in
opérateur et laremove
méthode parcourent la liste entière (jusqu'à ce qu'ils trouvent une correspondance), vous finissez donc par parcourir la liste plusieurs fois de cette façon.Vous pouvez utiliser l'affectation de tranche si la liste d'origine doit être modifiée, tout en utilisant une compréhension de liste efficace (ou une expression de générateur).
la source
x = [ v for v in x if x != 2 ]
propositions, qui créent une nouvelle liste et modifient x pour s'y référer, laissant la liste d'origine intacte.Répéter la solution du premier message de manière plus abstraite:
la source
x = [1] * 10000 + [2] * 1000
. Le corps de la boucle s'exécute 1000 fois et .remove () doit ignorer 10000 éléments chaque fois qu'il est invoqué. Cela me sent comme O (n * n) mais ce n'est pas une preuve. Je pense que la preuve serait de supposer que le nombre de 2 dans la liste est proportionnel à sa longueur. Ce facteur de proportionnalité disparaît alors en notation big-O. Le meilleur cas, cependant, d'un nombre constant de 2 seulement dans la liste, n'est pas O (n ^ 2), juste O (2n) qui est O (n).Voir la solution simple
Cela renverra une liste contenant tous les éléments de
x
sans2
la source
Toutes les réponses ci-dessus (à l'exception de celles de Martin Andersson) créent une nouvelle liste sans les éléments souhaités, plutôt que de supprimer les éléments de la liste d'origine.
Cela peut être important si vous avez d'autres références à la liste.
Pour modifier la liste en place, utilisez une méthode comme celle-ci
En ce qui concerne la vitesse, les résultats sur mon ordinateur portable sont (tous sur une liste de 5000 entrées avec 1000 entrées supprimées)
La boucle .remove est donc environ 100 fois plus lente ........ Hmmm, peut-être qu'une approche différente est nécessaire. Le plus rapide que j'ai trouvé utilise la compréhension de la liste, mais remplacez ensuite le contenu de la liste d'origine.
la source
def remove_all(x, l): return [y for y in l if y != x]
puisl = remove_all(3,l)
tu peux le faire
la source
Au détriment de la lisibilité, je pense que cette version est légèrement plus rapide car elle ne force pas le temps à réexaminer la liste, donc faire exactement le même travail que remove doit faire de toute façon:
la source
Approche Numpy et timings par rapport à une liste / tableau avec 1.000.000 éléments:
Calendrier:
Conclusion: numpy est 27 fois plus rapide (sur mon cahier) que l'approche de compréhension de liste
PS si vous souhaitez convertir votre liste Python régulière
lst
en tableau numpy:Installer:
Vérifier:
la source
la source
Pour supprimer toutes les occurrences en double et en laisser une dans la liste:
Voici la fonction que j'ai utilisée pour Project Euler:
la source
Je crois que c'est probablement plus rapide que toute autre façon si vous ne vous souciez pas de l'ordre des listes, si vous vous souciez de la commande finale, stockez les index de l'original et recourez à cela.
la source
Je pense que c'est beaucoup plus simple.
la source
Laisser
La solution la plus simple et la plus efficace, comme déjà publiée précédemment, est
Une autre possibilité qui devrait utiliser moins de mémoire mais être plus lente est
Résultats de synchronisation pour les listes de longueur 1000 et 100000 avec 10% d'entrées correspondantes: 0,16 contre 0,25 ms et 23 contre 123 ms.
la source
Supprimer toutes les occurrences d'une valeur d'une liste Python
Résultat:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
Alternativement,
Résultat:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
la source
Si vous n'avez pas intégré
filter
ou ne voulez pas utiliser d'espace supplémentaire et que vous avez besoin d'une solution linéaire ...la source
['Bonjour le monde']
la source
Je viens de le faire pour une liste. Je ne suis qu'un débutant. Un programmeur légèrement plus avancé peut sûrement écrire une fonction comme celle-ci.
la source
Nous pouvons également supprimer sur place tous les éléments à l'aide de
del
oupop
:Maintenant pour l'efficacité:
Comme nous le voyons, la version sur place
remove_values_from_list()
ne nécessite aucune mémoire supplémentaire, mais son exécution prend beaucoup plus de temps:la source
Personne n'a posté une réponse optimale pour la complexité du temps et de l'espace, alors j'ai pensé que je pourrais lui donner un coup de feu. Voici une solution qui supprime toutes les occurrences d'une valeur spécifique sans créer de nouveau tableau et à une complexité temporelle efficace. L'inconvénient est que les éléments ne maintiennent pas l' ordre .
Complexité temporelle: O (n)
Complexité d'espace supplémentaire: O (1)
la source
À propos de la vitesse!
la source
Uniquement avec Python 3
la source
Quel est le problème avec:
Utiliser anaconda
la source