Преобразование словарного значения из строки в список с одним элементом типа float - PullRequest
0 голосов
/ 16 июня 2020

У меня есть словарь, который выглядит так: d = {'a': '[1]', 'b': '[2]'}. Я хочу скрыть строковое значение в float и иметь d = {'a': [1], 'b': [2]}, поэтому значение должно быть списком с одним элементом типа float. Как это сделать?

Ответы [ 3 ]

2 голосов
/ 17 июня 2020
{k:[float(v.replace(']','').replace('[',''))] for k, v in d.items()}

OR

{k:[float(v[1,-1])] for k, v in d.items()}

ast.literal_eval создаст список int, но OP явно требует список float. Можно было:

import ast
{k: [float(a) for a in ast.literal_eval(v)] for k, v in d.items()}
0 голосов
/ 17 июня 2020

Я просто добавлю ссылку на синтаксис 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]}
0 голосов
/ 16 июня 2020

Вероятно, вы ищете python s eval() функцию:

d = {'a': '[1]', 'b': '[2]'}
for k in d:
    d[k] = eval(d[k])
print(d)

И вывод:

{'a': [1], 'b': [2]}

EDIT

Как указано в комментариях, eval иногда может быть опасным. Итак, вот альтернатива:

d = {'a': '[1]', 'b': '[2]'}
for k in d:
    d[k] = [float(d[k][1:-1])] # because the list conatins a single element
print(d)

EDIT2

Если вы хотите, чтобы альтернатива работала со списками с несколькими значениями:

замените эту строку

d[k] = [float(d[k][1:-1])]

с

d[k] = list(map(lambda x: float(x.strip()), d[k][1:-1].split(',')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...