Учитывая список имен переменных в 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'])
- Вы можете заменить `dict ((x, locals() [...)` прос ...
Ответ #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'
- и если вы используете метод 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()
- Я заставил это работать, исп ...
Ответ #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
Ответ на вопрос: Учитывая список имен переменных в 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 от того, что вы хотите.
-
18
-
14
-
8
-
11
-
2
-
3
-
6
-
4
-
3
-
7
-
11
-
5
-
6
-
5
-
6
-
12
-
9
-
2
-
6
-
2
-
4
-
4
-
7
-
5
-
2
-
8
-
7
-
3
-
3
-
8
-
5
-
5
-
3
-
3
-
11
-
4
-
5
-
9
-
5
-
6
-
5
-
7
-
2
-
2
-
2
-
4
-
6
-
8
-
5
-
7