Переменные 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 ответов:
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
основываясь на ответе муада, вот более питонический способ выбора переменных на основе префикса:
# 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 практически дал ответ, я просто сделал его полным)
...и как люди предположили, вы, вероятно, должны поместить их в словарь в первую очередь, но я предполагаю, что по какой-то причине вы не можете