Переменные Python в качестве ключей к дикт


есть ли более простой способ сделать это в 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 52

11 ответов:

for i in ('apple', 'banana', 'carrot'):
    fruitdict[i] = locals()[i]

The 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

один-лайнер:-

fruitdict = dict(zip(('apple','banana','carrot'), (1,'f', '3'))

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

# 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 в качестве аргументов.

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

fruitdict.update({k:v for k,v in locals().copy().iteritems() if k[:2] != '__' and k != 'fruitdict'})

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

>>> 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

Ну это немного, МММ ... не весть ... уродливый... программистские ...

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

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]

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

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

почему вы не делаете наоборот:

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

locals().update(fruitdict)

обновление :

Не используйте код выше проверьте комментарий.

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

# All the vars that i want to get are followed by _fruit
apple_fruit = 1
carrot_fruit = 'f'

for var in locals():
    if var.endswith('fruit'):
       you_dict.update({var:locals()[var])

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

Это не фантазии, как поставив все локальные переменные в словарь.

потому что это на самом деле"fancier"

ты хочешь:

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]

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

(Грег Hewgill практически дал ответ, я просто сделал его полным)

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

попробуй:

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}
a = "something"
randround = {}
randround['A'] = "%s" % a

работали.