2010-06-22 6 views
9

Comment supprimer un caractère d'un élément d'une liste?Édition d'éléments dans une liste en python

Exemple:

mylist = ['12:01', '12:02'] 

Je veux supprimer le côlon de l'horodatage dans un fichier, pour que je puisse les convertir plus facilement à un temps de 24 heures. En ce moment, j'essaie de faire une boucle sur les éléments de la liste et de chercher celui qui contient un deux-points et de faire un remplacement.

for num in mylist: 
    re.sub(':', '', num) 

Mais cela ne semble pas fonctionner.

Aide!

+3

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 –

Répondre

13

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).

4
for i, num in enumerate(mylist): 
    mylist[i] = num.replace(':','') 
+1

Par défaut, j'opte pour cette solution parce que vous ré-imbriquez les nouvelles chaînes dans le même objet liste. L'approche de compréhension de liste détache le résultat du pointeur de liste d'origine. Lorsque la liste est la propriété d'un objet complexe et que vous voulez que cet objet complexe ait la liste mise à jour, vous devrez assigner la nouvelle liste à une propriété, qui est très non-pythonique. – ddotsenko

15

Utilisez un list comprehension pour générer une nouvelle liste:

>>> mylist = ['12:01', '12:02'] 
>>> mylist = [s.replace(':', '') for s in mylist] 
>>> print mylist 
['1201', '1202'] 

La raison pour laquelle votre solution ne fonctionne pas est que re.sub retourne une nouvelle chaîne - chaînes sont immuables en Python, re.sub ne peut pas modifier vos chaînes existantes.

+0

Liste de compréhension à la rescousse! – jathanism

+0

Y a-t-il un avantage de la compréhension de liste à la norme pour les boucles, ou juste la lisibilité ou la longueur du code? – TooAngel

+3

@TooAngel: Il est plus génial;) –

0

Vous devez insérer le retour de re.sub dans la liste. Ci-dessous est pour une nouvelle liste. Mais vous pouvez le faire aussi pour mylist.

mylist = ['12:01', '12:02'] 
tolist = [] 
for num in mylist: 
    a = re.sub(':', '', num) 
    tolist.append(a) 

print tolist 
0

Les chaînes en python sont immuables, ce qui signifie qu'aucune fonction ne peut modifier le contenu d'une chaîne existante, mais seulement fournir une nouvelle chaîne. Voici why.Voir here pour une discussion sur les types de chaînes pouvant être modifiés. En pratique, cependant, il est préférable de s'adapter à l'immuabilité des cordes.