Учитывая список имен переменных в Python, как мне создать словарь с именами переменных в качестве ключей (к значениям переменных)?

У меня есть список имен переменных, например:

['foo', 'bar', 'baz']

(Первоначально 9X_ilist я спросил, как преобразовать список переменных. См. ответ 9X_py Грега Хьюджилла ниже.)

Как преобразовать 9X_dict это в словарь, где ключи - это имена переменных 9X_dict (в виде строк), а значения - это значения 9X_python-list переменных?

{'foo': foo, 'bar': bar, 'baz': baz}

Теперь, когда я снова задаю вопрос, я 9X_list-comparison придумал:

d = {}
for name in list_of_variable_names:
    d[name] = eval(name)

Можно ли это улучшить?

Обновить, отвечая 9X_py на вопрос (в комментарии) о том, почему 9X_list я хочу это сделать:

Я часто использую оператор% для 9X_lists строк со словарем имен и значений для интерполяции. Часто 9X_ilist имена в строке - это просто имена локальных 9X_lists переменных. Итак (с ответом ниже) я могу 9X_ilist сделать что-то вроде этого:

message = '''Name: %(name)s
ZIP: %(zip)s

Dear %(name)s,
...''' % dict((x, locals()[x]) for x in ['name', 'zip'])

16
1

  • Вы можете заменить `dict ((x, locals() [...)` прос ...
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Учитывая список имен переменных в Python, как мне создать словарь с именами переменных в качестве ключей (к значениям переменных)?

Забудьте о фильтрации locals()! Словарь, который 9X_dictionary вы даете строке форматирования, может содержать 9X_pythonista неиспользуемые ключи:

>>> name = 'foo'
>>> zip = 123
>>> unused = 'whoops!'
>>> locals()
{'name': 'foo', 'zip': 123, ... 'unused': 'whoops!', ...}
>>> '%(name)s %(zip)i' % locals()
'foo 123'

С новым f-string feature в Python 3.6 9X_dictionaries использование locals() больше не требуется:

>>> name = 'foo'
>>> zip = 123
>>> unused = 'whoops!'
>>> f'{zip: >5} {name.upper()}'
'  123 FOO'

16
1

  • и если вы используете метод str.format(), сделайте это так: `'{name} {zip}'. format (** locals())` ...

Ответ #2

Ответ на вопрос: Учитывая список имен переменных в Python, как мне создать словарь с именами переменных в качестве ключей (к значениям переменных)?

Вы можете использовать списки или генераторы 9X_ilist для создания списка кортежей ключей и значений, используемых 9X_pythonic для непосредственного создания экземпляра 9X_dictionaries dict. Лучший способ - ниже:

dict((name, eval(name)) for name in list_of_variable_names)

Кроме того, если 9X_lists вы знаете, например, что переменные существуют 9X_list-comparison в локальной таблице символов, вы можете 9X_python спастись от опасного eval, просмотрев переменную 9X_python-shell непосредственно у локальных пользователей:

dict((name, locals()[name]) for name in list_of_variable_names)

После 9X_py последнего обновления, я думаю, что приведенный 9X_pythonic ниже ответ - это то, что вам нужно. Если 9X_py вы просто используете это для расширения 9X_python-shell строки с помощью строк, которые вы контролируете, просто 9X_dictionary передайте locals() непосредственно в расширение 9X_ilist строки, и она выберет желаемые значения.

Если, однако, эти 9X_py строки могут когда-либо поступать из внешнего 9X_list-comparison источника (например, файлов перевода), тогда 9X_pythonic рекомендуется отфильтровать locals()

5
1

  • Я заставил это работать, исп ...

Ответ #3

Ответ на вопрос: Учитывая список имен переменных в Python, как мне создать словарь с именами переменных в качестве ключей (к значениям переменных)?

Ваш исходный список [foo, bar, baz] не содержит переменных 9X_ilist names, он просто содержит элементы, которые ссылаются 9X_python-interpreter на те же значения, что и перечисленные вами переменные. Это 9X_dictionaries потому, что у вас могут быть два разных 9X_pythonista имени переменных, которые относятся к одному 9X_python-interpreter и тому же значению.

Итак, список сам по себе 9X_lists не содержит информации о том, какие еще 9X_list имена относятся к объектам. Первый элемент 9X_py в вашем массиве имеет имя foo, но он также 9X_python-shell имеет имя a[0] (при условии, что ваш массив 9X_python-shell называется a). После выполнения следующего 9X_pythonista кода quux также обращается к тому же объекту:

quux = a[0]

Обновление: вы 9X_dictionary правы, что для этого можно использовать 9X_dictionary eval(), но его использование обычно не рекомендуется. Python 9X_python-interpreter предоставляет специальный член с именем 9X_python-shell __dict__, который содержит таблицу символов для 9X_ilist текущего модуля. Итак, вы можете:

import __main__
d = dict((x, __main__.__dict__[x]) for x in list_of_variable_names)

Наличие 9X_python-interpreter import __main__, когда ваш код находится в безымянном основном 9X_dictionaries модуле, - это особенность Python.

4
0

Ответ #4

Ответ на вопрос: Учитывая список имен переменных в Python, как мне создать словарь с именами переменных в качестве ключей (к значениям переменных)?

Неэффективно, но без вызова eval:

dict((k,v) for (k,v) in globals().iteritems() if k in list_of_variable_names)

или

dict((k,v) for (k,v) in vars().iteritems() if k in list_of_variable_names)

в зависимости 9X_pythonic от того, что вы хотите.

1
0