757 votes

convertit la représentation sous forme de chaîne de liste en liste en python

Je me demandais quel était le moyen le plus simple de convertir une liste de chaînes comme

 x = u'[ "A","B","C" , " D"]'
 

même si l'utilisateur place des espaces entre les virgules et des espaces à l'intérieur des guillemets. Je dois aussi gérer cela pour:

 x = ["A","B","C","D"] 
 

en python.

Je sais que je peux effacer les espaces avec strip et split en utilisant l'opérateur split et vérifier l'absence d'alphabets. Mais le code devenait très compliqué. Y at-il une fonction rapide que je ne connais pas

101voto

Mark Byers Points 318575

L' eval est dangereux - vous ne devriez pas exécuter la saisie de l'utilisateur.

Si vous avez 2.6 ou version plus récente, l'utilisation de l'ast au lieu de eval:

>>> import ast
>>> ast.literal_eval('["A","B" ,"C" ," D"]')
["A", "B", "C", " D"]

Une fois que vous avez, strip les cordes.

Si vous êtes sur une ancienne version de Python, vous pouvez obtenir de très près à ce que vous voulez avec un simple expression régulière:

>>> x='[  "A",  " B", "C","D "]'
>>> re.findall(r'"\s*([^"]*?)\s*"', x)
['A', 'B', 'C', 'D']

Ce n'est pas aussi bon que les ast solution, par exemple, il ne gère pas correctement échappé citations dans les chaînes. Mais c'est simple, n'est-ce pas un dangereux eval, et peut-être assez bon pour votre but si vous êtes sur une ancienne Python sans ast.

16voto

tosh Points 2647
import ast
l = ast.literal_eval('[ "A","B","C" , " D"]')
l = [i.strip() for i in l]

6voto

dirkjot Points 651

En supposant que toutes les entrées sont des listes et que les guillemets dans le champ de saisie n'ont pas réellement question, ce qui peut être fait avec un simple regexp remplacer. C'est un peu de perl-y, mais fonctionne comme un charme. Notez également que la sortie est maintenant une liste de chaînes unicode, vous ne précisez pas que vous avez besoin, mais il semble logique compte tenu de saisie unicode.

import re
x = u'[ "A","B","C" , " D"]'
junkers = re.compile('[[" \]]')
result = junkers.sub('', x).split(',')
print result
--->  [u'A', u'B', u'C', u'D']

Le junkers variable contient un compilé regexp (pour la vitesse) de tous les caractères que nous ne voulons pas, à l'aide de ] comme un caractère nécessaire des antislash la ruse. La re.sous remplace tous ces personnages n'ayant rien, et nous avons divisé la chaîne résultante à la virgule.

Notez que cela supprime également des espaces à l'intérieur des entrées u'["oh no"]' ---> [u'ohno']. Si ce n'est pas ce que tu voulais, l'expression doit être gonflé un peu.

3voto

antitrust Points 4853

avec numpy cela fonctionne de manière très simple

 x = u'[ "A","B","C" , " D"]'
list_string = str(x)
import numpy as np
print np.array(list_string)
 

donne

 >>> 
[ "A","B","C" , " D"]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X