La solution de compréhension de la liste est le plus Pythonic, mais il y a une torsion importante:
mylist[:] = [s.replace(':', '') for s in mylist]
Si vous attribuez à mylist
, le barename, comme dans l'autre réponse, plutôt que de mylist[:]
, la "tranche de liste entière", comme je le recommande, vous faites vraiment quelque chose de très différent de "remplacer les entrées dans la liste": vous faites une nouvelle liste et juste relier le nom de barre que vous utilisiez précédemment se référer à l'ancienne liste.
Si cette ancienne liste est référencée par plusieurs noms (y compris les entrées dans des conteneurs), cette reliure n'a aucune incidence sur ceux-ci: par exemple, si vous avez une fonction qui prend mylist
comme argument, l'affectation de nom de barre n'a d'effet que localement sur la fonction, et ne modifie pas ce que l'appelant voit comme le contenu de la liste.
Affectation à la tranche toute liste, mylist[:] = ...
, modifie l'objet de la liste plutôt que de bidouiller avec les fixations de barenames de commutation - maintenant que la liste est vraiment modifiée et, peu importe comment on l'appelle, la nouvelle valeur est ce qui est vu Par exemple, si vous avez une fonction qui prend mylist
comme argument, l'attribution de tranche de liste entière modifie ce que l'appelant voit comme le contenu de la liste. L'essentiel est de savoir exactement quel effet vous recherchez - le plus souvent, vous voudrez modifier l'objet de la liste, donc, si l'on doit deviner, l'assignation de la tranche entière est généralement la meilleure estimation à faire ;-). Du point de vue des performances, cela ne fait aucune différence (sauf que l'assignation de nom de barre, si elle conserve à la fois les anciens et les nouveaux objets de la liste, occupera plus de mémoire pendant un laps de temps).
Cela ne fonctionne pas car les chaînes sont immuables. 're.sub' en fait ** renvoie ** une chaîne mais vous ne l'attribuez pas. Lisez la documentation: http://docs.python.org/library/re.html#re.sub –