Переменные Python как ключи для диктовки - PullRequest
59 голосов
/ 20 октября 2010

Есть ли более простой способ сделать это в Python (2.7) ?: Примечание: это не так уж и сложно, как поместить все локальные переменные в словарь.Только те, которые я указываю в списке.

apple = 1
banana = 'f'
carrot = 3
fruitdict = {}

# I want to set the key equal to variable name, and value equal to variable value
# is there a more Pythonic way to get {'apple': 1, 'banana': 'f', 'carrot': 3}?

for x in [apple, banana, carrot]:
    fruitdict[x] = x # (Won't work)

Ответы [ 11 ]

64 голосов
/ 20 октября 2010
for i in ('apple', 'banana', 'carrot'):
    fruitdict[i] = locals()[i]
14 голосов
/ 20 октября 2010

Функция globals() возвращает словарь, содержащий все ваши глобальные переменные.

>>> apple = 1
>>> banana = 'f'
>>> carrot = 3
>>> globals()
{'carrot': 3, 'apple': 1, '__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'banana': 'f'}

Существует также аналогичная функция с именем locals().

Я понимаю, что это, вероятно, не совсем то, что вы хотите, но это может дать некоторое представление о том, как Python предоставляет доступ к вашим переменным.

Edit : Похоже, ваша проблемалучше всего решить, просто используя словарь:

fruitdict = {}
fruitdict['apple'] = 1
fruitdict['banana'] = 'f'
fruitdict['carrot'] = 3
6 голосов
/ 20 октября 2010

Однострочник: -

fruitdict = dict(zip(('apple','banana','carrot'), (1,'f', '3'))
3 голосов
/ 18 октября 2016

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

fruitdict.update({k:v for k,v in locals().copy().iteritems() if k[:2] != '__' and k != 'fruitdict'})
2 голосов
/ 07 мая 2014

Основываясь на ответе mouad, вот более питонский способ выбора переменных на основе префикса:

# All the vars that I want to get start with fruit_
fruit_apple = 1
fruit_carrot = 'f'
rotten = 666

prefix = 'fruit_'
sourcedict = locals()
fruitdict = { v[len(prefix):] : sourcedict[v]
              for v in sourcedict
              if v.startswith(prefix) }
# fruitdict = {'carrot': 'f', 'apple': 1}

Вы даже можете поместить это в функцию с префиксом и sourcedict в качестве аргументов.

1 голос
/ 19 сентября 2018

Попробуйте:

to_dict = lambda **k: k
apple = 1
banana = 'f'
carrot = 3
to_dict(apple=apple, banana=banana, carrot=carrot)
#{'apple': 1, 'banana': 'f', 'carrot': 3}
1 голос
/ 20 октября 2010

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

>>> apple = 1
>>> banana = 'f'
>>> carrot = 3
>>> fruitdict = {}
>>> fruitdict['apple'] = lambda : apple
>>> fruitdict['banana'] = lambda : banana
>>> fruitdict['carrot'] = lambda : carrot
>>> for k in fruitdict.keys():
...     print k, fruitdict[k]()
... 
carrot 3
apple 1
banana f
>>> apple = 7
>>> for k in fruitdict.keys():
...     print k, fruitdict[k]()
... 
carrot 3
apple 7
banana f
0 голосов
/ 21 января 2013
a = "something"
randround = {}
randround['A'] = "%s" % a

Работал.

0 голосов
/ 20 октября 2010

На этот вопрос практически был дан ответ, но я просто хотел сказать, что было забавно, что вы сказали

Это не так уж и красиво, как помещение всех локальных переменных в словарь.

Потому что это на самом деле "любитель"

, что вы хотите:

apple = 1
banana = 'f'
carrot = 3
fruitdict = {}

# I want to set the key equal to variable name, and value equal to variable value
# is there a more Pythonic way to get {'apple': 1, 'banana': 'f', 'carrot': 3}?

names= 'apple banana carrot'.split() # I'm just being lazy for this post
items = globals()                    # or locals()

for name in names:
    fruitdict[name] = items[name]

Честно говоря, вы просто копируете элементы из одного словаря в другой.

(Грег Хьюгилл практически дал полный ответ, я только что закончил его)

... и, как и предполагали люди, вы, вероятно, должны сначала поместить их в словарь, но япредположим, что по какой-то причине вы не можете

0 голосов
/ 20 октября 2010

Ну, это немного, хм ... непифонический ... некрасивый ... хакский ...

Вот фрагмент кода, предполагающий, что вы хотите создать словарь всех локальных переменныхВы создаете после того, как определенная контрольная точка взята:

checkpoint = [ 'checkpoint' ] + locals().keys()[:]
## Various local assigments here ...
var_keys_since_checkpoint = set(locals().keys()) - set(checkpoint)
new_vars = dict()
for each in var_keys_since_checkpoint:
   new_vars[each] = locals()[each]

Обратите внимание, что мы явно добавляем ключ 'контрольной точки' в наш захват locals().keys() Я также явно беру часть этого, хотя это не должно 'в этом случае это необходимо, так как ссылка должна быть сведена, чтобы добавить ее в список ['checkpoint'].Однако, если вы использовали вариант этого кода и пытались сократить ['checkpoint'] + portion (because that key was already in locals () , for example) ... then, without the [:] slice you could end up with a reference to the locals (). Keys () `, значения которых будут меняться при добавлении переменных.

OffhandЯ не могу придумать способ вызвать что-то вроде new_vars.update() со списком ключей, которые будут добавлены / обновлены.Так что цикл for является наиболее переносимым.Я полагаю, что словарь может быть использован в более поздних версиях Python.Однако это будет не более чем игра в гольф.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...