Подтвердить что ты не робот

Переменные Python как ключи к dict

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

Ответ 1

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

Ответ 2

Функция 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 предоставляет доступ к вашим переменным.

Изменить. Похоже, ваша проблема может быть лучше решена простым использованием словаря:

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

Ответ 3

Один вкладыш: -

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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() `, чьи значения изменились при добавлении переменных.

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

Ответ 8

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

Это не что-то необычное, как включение всех локальных переменных в словарь.

Потому что это на самом деле "странный"

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

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]

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

(Грег Хьюджилл практически дал весь ответ, я просто сделал это)

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

Ответ 9

На основе ответа mouad, здесь более pythonic способ выбора переменных на основе префикса:

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

Ответ 10

a = "something"
randround = {}
randround['A'] = "%s" % a

Работали.