Я просто добавлю ссылку на синтаксис Python PEP 274 c для такого рода вещей, Dict Computing :
>>> d = {'a': '[1]', 'b': '[2]'}
>>> d = {k: eval(v) for k, v in d.items()}
>>> d
{'a': [1], 'b': [2]}
Это немного больше компактный, но работает точно так же.
Вы также сделали следующее примечание:
поэтому значение должно быть списком с одним элементом типа float.
Приведенный выше код можно изменить, чтобы сделать это достаточно легко, но я должен упомянуть, что по большей части вы можете использовать Python целые числа везде, где вам нужно число с плавающей запятой.
>>> d = {'a': '[1]', 'b': '[2]'}
>>> d = {k: [float(eval(v)[0])] for k, v in d.items()}
>>> d
{'a': [1.0], 'b': [2.0]}
РЕДАКТИРОВАТЬ
Я не могу ответить на ваш комментарий из-за репутации, JoKing, но это отличное напоминание. Однако типичным вариантом использования этого преобразования, вероятно, является не получение исходного кода от потенциально вредоносных третьих сторон и его локальное выполнение. Поэтому я бы сказал, что в случае простой обработки данных, когда вы управляете данными io, а ваш исходный код не публикуется c или не публикуется, eval()
абсолютно нормально.
OP добавил дополнительный вопрос в отношении упомянутых опасностей eval()
:
Итак, вместо «[1]» я говорю «[1, 2]»
Если вы используйте предыдущие методы, чтобы убрать скобки, вы можете использовать .split (","), чтобы разделить список на отдельные строки, которые нужно преобразовать. Использование понимания dict здесь становится более уродливым (потому что оно содержит понимание списка для объяснения этого нового случая), но оно все еще работает:
>>> d = {'a': '[1, 2]', 'b': '[2]'}
>>> d = {k: [float(i) for i in v[1:-1].split(",")] for k, v in d.items()}
{'a': [1.0, 2.0], 'b': [2.0]}