2015-04-18 4 views
4

У меня есть такие строки, как:Как преобразовать строку в dict или list?

'[1, 2, 3]'

и

"{'a': 1, 'b': 2}"

Как преобразовать их в список/Dict?

Кто-то упоминает, что ast.literal_eval или eval может анализировать строку, которая преобразуется в список/dict.

В чем разница между ast.literal_eval и eval?

ответ

7

ast.literal_eval анализирует абстрактные деревья синтаксиса. У вас почти есть json, для которого вы можете использовать json.loads, но вам нужны двойные кавычки, а не одинарные кавычки, чтобы словарные ключи были действительными.

import ast 

result = ast.literal_eval("{'a': 1, 'b': 2}") 
assert type(result) is dict 

result = ast.literal_eval("[1, 2, 3]") 
assert type(result) is list 

Как плюс, это не имеет ни одного риска eval, потому что он не получает в бизнесе оценки функций. eval("subprocess.call(['sudo', 'rm', '-rf', '/'])") может удалить корневой каталог, но ast.literal_eval("subprocess.call(['sudo', 'rm', '-rf', '/'])") непредсказуем, с вашей файловой системой нетронутой.

2

Используйте функцию Eval:

l = eval('[1, 2, 3]') 

d = eval("{'a':1, 'b': 2}") 

Просто убедитесь, что вы знаете, где эти строки пришли и что вы не позволяете пользовательский ввод оценивать и делать что-то злонамеренный.

0

Вы можете eval(), но только с безопасными данными. В противном случае, если вы разобрали небезопасные данные, посмотрите более безопасный ast.literal_eval().

JSON-парсер также является возможностью, большинство питонов-диктонов и списков имеют одинаковый синтаксис.

1

Вы можете преобразовать строку в список/dict по ast.literal_eval() или eval() функции. ast.literal_eval() рассматривает только небольшое подмножество синтаксиса Python, чтобы быть действительным:

Строка или узел при условии, может состоять только из следующих Python буквенных структур: строки, числа, кортежи, списки, dicts, булевы, и None ,

Передача __import__('os').system('rm -rf /') в ast.literal_eval() вызовет ошибку, но eval() счастливо протирать диск.

Поскольку похоже, что вы разрешаете пользователю вводить простой словарь, используйте ast.literal_eval(). Он безопасно делает то, что вы хотите, и ничего больше.

0

питон скрипт для преобразования этой строки в Сыроватского: -

import json 

inp_string = '{"1":"one", "2":"two"}' 
out = json.loads(inp_string) 
print out["1"] 

O/P, как:

"one" 
Смежные вопросы