2013-08-06 22 views
5

ho una stringa come questa "['first', 'sec', 'third']"stringa di Python per elencare le migliori pratiche

Quale sarebbe il modo migliore per convertire questo in una lista di stringhe vale a dire. ['first', 'sec', 'third']

+1

Il modo migliore sarebbe utilizzare un formato di serializzazione noto, come json. –

risposta

10

userei literal_eval(), è sicuro:

sicura valutare un nodo un'espressione o una stringa contenente un'espressione Python . La stringa o il nodo fornito può consistere solo in seguenti strutture letterali Python: stringhe, numeri, tuple, elenchi, dicts, booleans e None.

Questo può essere utilizzato per valutare in modo sicuro le stringhe contenenti espressioni Python da fonti non attendibili senza la necessità di analizzare autonomamente i valori .

>>> import ast 
>>> ast.literal_eval("['first', 'sec', 'third']") 
['first', 'sec', 'third'] 

Essa non eval nulla, tranne le espressioni letterali:

>>> ast.literal_eval('"hello".upper()') 
... 
ValueError: malformed string 

>>> ast.literal_eval('"hello"+" world"') 
... 
ValueError: malformed string 
+0

Grazie alecxe, ho usato questo, ma sono curioso di vedere cosa pensano le persone, altri metodi ecc. – Ruth

+2

+1 - Questo è il modo migliore per farlo, poiché 'ast.literal_eval()' è sicuro, al contrario per 'eval()'. Detto questo, l'opzione migliore è probabilmente quella di archiviare i dati in un formato più standardizzato, se possibile. –

1

Se stanno sempre formattati come dici tu tutte le stringhe sono citati nello stesso modo, una semplice spaccatura dovrebbe farlo anche:

Questa soluzione è molto più fragile, in quanto supporterà solo un singolo quo stile.

È molto più veloce, però.

%timeit "['first', 'sec', 'third']".split("'")[1::2] 
1000000 loops, best of 3: 726 ns per loop 

%timeit ast.literal_eval("['first', 'sec', 'third']") 
10000 loops, best of 3: 21.8 us per loop 
+0

Fantastico, ma se la lista fosse '" ['first', 'sec', 'third', \ "fourth \"] "' o anche 'L =" "" ['first', 'sec', ' terzo ', "quarto"] "" "' – TerryA

+0

Bei esempi. Lascerò la risposta in diretta, spero che aiuti a mostrare perché literal_eval è la pratica migliore. –

Problemi correlati