Je dois parcourir une liste et remplacer toutes les occurrences d'un élément par un autre. Jusqu'à présent, mes tentatives de code ne me mènent nulle part, quelle est la meilleure façon de procéder?
Par exemple, supposons que ma liste ait les entiers suivants
>>> a = [1,2,3,4,5,1,2,3,4,5,1]
et je dois remplacer toutes les occurrences du nombre 1 par la valeur 10 de sorte que la sortie dont j'ai besoin est
>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]
Mon objectif est donc de remplacer toutes les instances du nombre 1 par le nombre 10.
Réponses:
la source
Essayez d'utiliser une compréhension de liste et l' opérateur ternaire .
la source
a
non? Je pense que OP voulaita
changera
faut muter, mais (comme le montre Alekhya), il est trivial de gérer l'un ou l'autre cas lors de l'utilisation d'une liste de compréhension.a
vous devez le fairea[:] = [4 if x==1 else x for x in a]
(notez la tranche de la liste complète). Le simple fait dea =
créer une nouvelle listea
avec uneid()
(identité) différente de l'originalLa compréhension de la liste fonctionne bien, et parcourir avec énumérer peut vous faire économiser de la mémoire (car l'opération est essentiellement effectuée sur place).
Il y a aussi une programmation fonctionnelle. Voir l'utilisation de la carte :
la source
lambda
etmap
sont considérés comme non pythoniques.Si vous avez plusieurs valeurs à remplacer, vous pouvez également utiliser un dictionnaire:
la source
n
n'est pas trouvé dansdic
?n
n'est pas trouvée. J'espère que ça ne vous dérange pas. Votretry/except
solution n'était pas bonne.try-except
c'est au moins 50% plus rapide! Jetez un oeil à cette réponseif n in dic.keys()
est mauvais en termes de performances. Utiliserif n in dic
oudic.get(n,n)
(valeur par défaut)la source
Vous pouvez utiliser une boucle for et or while; cependant, si vous connaissez la fonction Enumerate intégrée, il est recommandé d'utiliser Enumerate. 1
la source
Pour remplacer facilement tout
1
avec10
dansa = [1,2,3,4,5,1,2,3,4,5,1]
on pourrait utiliser ce qui suit une ligne lambda + combinaison de la carte, et 'Look, Ma, pas ou Fors FI! :# 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))
la source
lambda
élément sur chaque liste ...Ce qui suit est une méthode très directe en Python 2.x
Cette méthode fonctionne. Les commentaires sont les bienvenus. J'espère que ça aide :)
Essayez également de comprendre le fonctionnement des solutions d' Outis et de Damzam . Les compressions de liste et la fonction lambda sont des outils utiles.
la source
Sur les longues listes et les occurrences rares, il est environ 3 fois plus rapide à utiliser
list.index()
- par rapport aux méthodes d'itération en une seule étape présentées dans les autres réponses.la source
Je sais que c'est une très vieille question et il existe une multitude de façons de le faire. Le plus simple que j'ai trouvé utilise
numpy
package.la source
Mon cas d'utilisation remplaçait
None
par une valeur par défaut.J'ai chronométré les approches de ce problème qui ont été présentées ici, y compris celle de @kxr - using
str.count
.Testez le code en ipython avec Python 3.8.1:
Je reçois:
L'utilisation de l'interne
str.index
est en fait plus rapide que toute comparaison manuelle.Je ne savais pas si l'exception du test 4 serait plus laborieuse que l'utilisation
str.count
, la différence semble négligeable.Notez que
map()
(test 6) renvoie un itérateur et non une liste réelle, donc test 7.la source
Vous pouvez simplement utiliser la compréhension de liste en python:
pour votre cas, où vous souhaitez remplacer toutes les occurrences de 1 par 10, l'extrait de code sera comme ceci:
la source
Trouver et remplacer un seul article
la source