trouver et remplacer des éléments dans une liste
- Je effectuer une recherche dans une liste et de les remplacer toutes les occurrences d'un élément à un autre. Pour l'instant, mes tentatives dans le code sont me procurer nulle part, quelle est la meilleure façon de le faire?
Par exemple, supposons que ma liste a la suite des entiers
>>> a = [1,2,3,4,5,1,2,3,4,5,1]
et j'ai besoin de remplacer toutes les occurrences du numéro 1 avec la valeur 10, de sorte que la sortie j'ai besoin est
>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
Donc mon but est de remplacer toutes les occurrences du numéro 1 au numéro 10.
- Qu'est-ce, par le chemin?
- Double de stackoverflow.com/q/1540049/819417
InformationsquelleAutor James | 2010-04-06
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser un compréhension de liste et la opérateur ternaire.
a
bien droit? Je pense que l'OP voulaita
pour changera
doit muter, mais (comme Alekhya montre) c'est trivial pour traiter des cas lors de l'utilisation d'une compréhension de liste.a
alors vous devriez le fairea[:] = [4 if x==1 else x for x in a]
(note la liste complète tranche). Lea =
va créer une nouvelle listea
avec un autreid()
(identité) de l'originalCompréhension de liste fonctionne bien, et en parcourant avec énumérer peuvent vous faire économiser de la mémoire (b/c l'opération est essentiellement fait à la place).
Il y a aussi de la programmation fonctionnelle. Voir la section utilisation de carte:
lambda
etmap
sont considérés comme unpythonic.Si vous avez plusieurs valeurs à remplacer, vous pouvez également utiliser un dictionnaire:
n
n'est pas trouvé dansdic
?n
n'est pas trouvé. J'espère que vous n'avez pas l'esprit. Votretry/except
solution n'est pas bonne.try-except
est d'au moins 50% plus rapide! Jetez un oeil à cette répondreif n in dic.keys()
est mauvais pour les performances. Utilisationif n in dic
oudic.get(n,n)
(valeur par défaut)try-except
est plus rapide, mais il casse la boucle, à la première occurrence de l'élément inconnu, etdic.get(n,n)
est belle, mais plus lent queif n in dic
. J'ai édité ma réponse.dic.get(n,n)
est très légèrement plus lent quedic[n] if n in dic else n
mais beaucoup plus lisible (à mon humble avis) je vous suggère de l'utiliser pour quoi que ce soit, sauf si vous êtes vraiment essayer d'optimiser certains boucle.[1, {'boom!'}, 3]
)Vous pouvez utiliser un pour et ou boucle while; toutefois, si u connaître les builtin Énumérer fonction, il est recommandé d'utiliser l'énumération est terminée.Un
Pour remplacer facilement tous les
1
avec10
dansa = [1,2,3,4,5,1,2,3,4,5,1]
on pourrait utiliser la suite d'une ligne lambda+combinaison de cartes, et " Regarde, Ma, pas IFs ou FORs!' :# This substitutes all '1' with '10' in list 'a' and places result in list 'c':
c = list(map(lambda b: b.replace("1","10"), a))
Ce qui suit est une très méthode directe en Python 2.x
Cette méthode fonctionne. Les commentaires sont les bienvenus. Espérons que cela aide 🙂
Aussi essayer de comprendre comment outis de l' et damzam de l' solutions de travail. Liste des compressions et de la fonction lambda sont des outils utiles.
Vous pouvez simplement utiliser compréhension de liste en python:
pour votre cas, si vous voulez remplacer toutes les occurrences de 1 à 10, l'extrait de code sera comme ceci:
Je sais que c'est une très vieille question, et il y a une multitude de façons de le faire. Le plus simple que j'ai trouvé est à l'aide de
numpy
paquet.Rechercher & remplacer un élément
Sur de longues listes et la rareté de ses environ 3x plus rapide en utilisant
list.index()
par rapport à une seule étape d'itération méthodes présentées dans les autres réponses.