Pythonvariables作为字典的关键

有没有更容易的方法来做到这一点在Python(2.7)?:注意:这不是什么幻想,像把所有的本地variables放到一个字典。 只是我在列表中指定的那些。

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) 
 for i in ('apple', 'banana', 'carrot'): fruitdict[i] = locals()[i] 

globals()函数返回一个包含所有全局variables的字典。

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

还有一个类似的函数locals()

我意识到这可能不是你想要的东西,但它可以提供一些Python如何提供访问variables的洞察力。

编辑 :这听起来像你的问题可能会更好地通过简单地使用字典在第一个地方解决:

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

单行是:

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

如果你想绑定variables本身的位置,这是这样的:

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

这是在一行中,而不必重新键入任何variables或它们的值:

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

那么这是有点呃非pythonic丑陋的… hackish …

下面是一段代码,假设您想要创build一个在创build特定检查点之后创build的所有局部variables的字典:

 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快捷化['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()的值,当你添加variables的时候它们的值将会改变。

Offhand我想不出一种方式来调用像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]) 

这个问题实际上已经回答了,但我只是想说,你说的很有趣

这不是什么奇特的东西,比如把所有的局部variables放到字典中。

因为它实际上是“发烧友”

你想要的是:

 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] 

老实说,你正在做的只是从一个字典复制项目到另一个。

(Greg Hewgill实际上给出了整个答案,我只是把它完成了)

…就像人们所build议的那样,你可能应该把这些放在字典里,但是我会假设由于某种原因你不能

基于mouad的回答,下面是一个更基础的方式来select基于前缀的variables:

 # 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作为参数的函数中。

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

工作。