Преобразуване на низ в списък в Python без използване на Eval?

Имам низ, нещо като това: "[['Cheese', 72], ['Milk', 45], ['Bread', 22]]".

Искам да преобразувам това в списък. Знам, че мога да използвам eval(string), за да получа списъка, но eval ме плаши поради потенциала си за катастрофа (и защото мога да получа несписък като валиден изход). Има ли друг по-разумен/безопасен начин да превърнете този низ в списък? Знам, че това е списък и всичко, което не е списък, е невалидни данни (и трябва да се провери за и/или да изведе грешка).


person Jason Champion    schedule 24.10.2013    source източник
comment
Ще искате да разгледате този модул: docs.python.org/2/library/ast .html   -  person squiguy    schedule 25.10.2013
comment
Като малко предистория: наследих приложение на Django, където предишният разработчик съхранява списък с елементи в таблица на база данни като низ. Не трябва да се прави по този начин и аз не съм против използването на миграция на данни за конвертиране в JSON, но ако има тайно ръкостискане за анализиране на списък, добре според мен.   -  person Jason Champion    schedule 25.10.2013


Отговори (4)


Ако настоявате да го направите по този начин, можете да използвате функцията ast.literal_eval.

>>> import ast
>>> foo = "[['Cheese', 72], ['Milk', 45], ['Bread', 22]]"
>>> ast.literal_eval(foo)
[['Cheese', 72], ['Milk', 45], ['Bread', 22]]

Сигурен съм, че другите ще ви кажат, че вероятно правите нещо нередно или че използвате библиотека като JSON за транспортиране на произволни структури от данни като тази, и аз не бих се съгласил.

person VooDooNOFX    schedule 24.10.2013
comment
Само в случай, че някой получи ValueError, не забравяйте първо да промените foo на string и след това да приложите ast.literal_eval(foo) - person techriften; 21.03.2016

Опитайте да използвате json модул:

import json
s = "[['Cheese', 72], ['Milk', 45], ['Bread', 22]]"
s = s.replace("'", '"')
print json.loads(s)
person Robin Krahl    schedule 24.10.2013

Може да обмислите използването на модула json за десериализация и да се уверите, че вашите низове са във json формат.

Вижте http://docs.python.org/2/library/json.html за подробности относно използването на този модул.

person David Ginsburg    schedule 24.10.2013

Ето един начин: exec("list = "+foo) Това трябва да създаде променлива 'list' със списъка в низ, преобразуван в истински списък. Това също работи за речници, масиви, булеви и т.н. в низове.

person fzerowipeoutlover    schedule 21.01.2014
comment
Не съм експерт по Python. Това наистина ли е по-добро от използването на eval? Не е ли все още също толкова експлоатируем? - person jerry; 21.01.2014