Ответ 1
Это то, что я искал:
>>> d = {'a':1, 'b':2}
>>> for key,val in d.items():
exec(key + '=val')
Существует ли питонический способ присвоения значений словаря его ключам, чтобы преобразовать словарные словарные записи в переменные? Я пробовал это:
>>> d = {'a':1, 'b':2}
>>> for key,val in d.items():
exec('exec(key)=val')
exec(key)=val
^
SyntaxError: invalid syntax
UPDATE: Возможно, я должен был быть более конкретным: я действительно уверен, что пары ключ-значение верны, потому что раньше они были определены как переменные. Затем я сохранил эти переменные в словаре (как пары ключ-значение) и хотел бы повторно использовать их в другой функции. Я мог бы просто определить их снова в новой функции, но поскольку у меня может быть словарь с примерно 20 записями, я думал, что может быть более эффективный способ сделать это.
Это то, что я искал:
>>> d = {'a':1, 'b':2}
>>> for key,val in d.items():
exec(key + '=val')
Вы можете сделать это в одной строке с помощью:
>>> d = {'a': 1, 'b': 2}
>>> locals().update(d)
>>> a
1
Однако вы должны быть осторожны с тем, как Python может оптимизировать доступ локальных/глобальных пользователей при использовании этого трюка.
Я думаю, что редактирование locals()
, как это вообще плохая идея. Если вы думаете, что globals()
- лучшая альтернатива, подумайте дважды!: -D
Вместо этого я бы предпочел всегда использовать пространство имен.
С Python 3 вы можете:
>>> from types import SimpleNamespace
>>> d = {'a': 1, 'b': 2}
>>> n = SimpleNamespace(**d)
>>> n.a
1
Если вы застряли в Python 2 или вам нужно использовать некоторые функции, отсутствующие в types.SimpleNamespace
, вы также можете:
>>> from argparse import Namespace
>>> d = {'a': 1, 'b': 2}
>>> n = Namespace(**d)
>>> n.a
1
Если вы не собираетесь изменять свои данные, вы можете также рассмотреть возможность использования collections.namedtuple
, также доступного в Python 3.
У вас уже есть отличный словарь. Просто используйте это. Если вы знаете, какие ключи будут, и вы абсолютно уверены, что это разумная идея, вы можете сделать что-то вроде
a, b = d['a'], d['b']
но большую часть времени вы должны просто использовать словарь. (Если использование словаря неудобно, вы, вероятно, не организуете свои данные, попросите его реорганизовать его.)
Рассмотрим решение "Bunch" в Python: загрузите переменные в dict в пространство имен. Ваши переменные заканчиваются как часть нового объекта, а не как локальные, но вы можете рассматривать их как переменные вместо записей dict.
class Bunch(object):
def __init__(self, adict):
self.__dict__.update(adict)
d = {'a':1, 'b':2}
vars = Bunch(d)
print vars.a, vars.b
Используйте pandas:
import pandas as pd
var=pd.Series({'a':1, 'b':2})
#update both keys and variables
var.a=3
print(var.a,var['a'])