2013-08-06 12 views
5

mam ciąg jak to "['first', 'sec', 'third']"Python ciąg do listy najlepszych praktyk

Jaki byłby najlepszy sposób przekonwertować to do listy ciągów tj. ['first', 'sec', 'third']

+1

Najlepszym sposobem byłoby użycie znanego formatu serializacji, takiego jak json. –

Odpowiedz

10

użyję literal_eval(), że to bezpieczne:

Bezpiecznie ocenić węzeł wyrażenie lub łańcuch zawierający wyrażenie Python . Dostarczony ciąg lub węzeł może składać się tylko z następujących po literalnych strukturach Python: łańcuchów, liczb, krotek, list, znaków, wartości logicznych i Brak.

Można to wykorzystać do bezpiecznego oceniania ciągów zawierających wyrażenia Python z niezaufanych źródeł bez konieczności analizowania wartości .

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

To nie ma nic oprócz eval dosłownych wyrażeń:

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

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

Dzięki alecxe, używałem tego, ale jestem ciekawy, co ludzie myślą, inne metody itp. – Ruth

+2

+1 - To jest najlepszy sposób, aby to zrobić, ponieważ 'ast.literal_eval()' jest bezpieczny, w przeciwieństwie do do 'eval()'. To powiedziawszy, najlepszą opcją jest prawdopodobnie przechowywanie danych w bardziej znormalizowanym formacie, jeśli to możliwe. –

1

Jeśli że oni zawsze sformatowane jak mówisz wszystkie ciągi podane są w taki sam sposób, prosty podział powinien to również zrobić:

"['first', 'sec', 'third']".split("'")[1::2] 

To rozwiązanie jest o wiele bardziej kruche, ponieważ będzie obsługiwać tylko pojedyncze quo styl.

Jest to jednak znacznie szybsze.

%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

Fajnie, ale co jeśli lista była "" ["pierwsza", "sekunda", "trzecia", \ "czwarta \"] "" lub nawet "L =" "" ["pierwsza", "sekunda", " third ', "fourth"] "" " – TerryA

+0

Dobre przykłady. Pozwolę na odpowiedź na żywo, mam nadzieję, że pomoże to wskazać, dlaczego literal_eval jest lepszą praktyką. –

Powiązane problemy