Вопрос по list, python, string – Преобразование строкового представления списка в фактический объект списка [duplicate]

70

На этот вопрос уже есть ответ:

Преобразовать строковое представление списка в список 14 ответов

У меня есть строка, которая выглядит идентично списку, скажем:

frui#s = "['apple', 'orange', 'banana']"

Как бы это можно было преобразовать в объект списка?

Ваш Ответ

3   ответа
99
>>> fruits = "['apple', 'orange', 'banana']"
>>> import ast
>>> fruits = ast.literal_eval(fruits)
>>> fruits
['apple', 'orange', 'banana']
>>> fruits[1]
'orange'

Ast.literal_eval являетсясей. Из документов:

Safely оцените узел выражения или строку, содержащую выражение Python. Предоставленная строка или узел могут состоять только из следующих литеральных структур Python: строк, чисел, кортежей, списков, слов, логических значений и None.

Это можно использовать для безопасной оценки строк, содержащих выражения Python из ненадежных источников, без необходимости разбора значений самостоятельно.

Заметк: это не сработает, если вы вызываете функцию внутри массива (или любого другого типа, кроме строк, чисел, кортежей, списков, диктов, логических значений и None). Для этих случаев вы можете использоватьeval. Arka
Примечание на заметку:ast.literal_eval успешен только для литералов и ничего больше. Это защищает ваша программа от внедрения кода, например"['apple', 'orange', 'banana'];import os;os.remove('a_file')" потерпит неудачу сliteral_eval Boud
У меня тоже есть такая же проблема, но мой список строк такой:fruits = "['apple', 'orange', 'banan'a']" как бы вы справились с запятой междуbanana а такжеa. Muhammad Taqi
Избавил меня от работы со строками. TheExorcist
22

Простой вызовeval() Сделаю

fruits = eval("['apple', 'orange', 'banana']")
fruits
> ['apple', 'orange', 'banana']

Или как объяснено в этомстать, то же самое можно сделать чуть более безопасно (то есть без риска непреднамеренных побочных эффектов или внедрения вредоносного кода), например:

fruits = eval("['apple', 'orange', 'banana']", {'__builtins__':None}, {})

Это решение имеет то преимущество, что не зависит от дополнительных модулей.

Это достигается немного безопаснее с помощьюeval(frtstring,{__builtins__:None},{}) mgilson
-1 Нет смысла использоватьeval() Вот.ast.literal_eval() сделает работу намного лучше и безопаснее. Gareth Latty
@ mgilson спасибо за совет, я обновил свой ответ Óscar López
В то время какast.literal_eval лучше для этого,eval работает (и это полезно время от времени, поэтому о нем стоит знать). Я не вижу смысла понижать его, поскольку он делает то, что задал вопрос (+1 от меня). mgilson
@ mgilson: использование @ имеет серьезные последствия для безопасносeval(), что даже{'__builtins__': None} не собирается вас спасать. Martijn Pieters♦
2

Похожие вопросы