2010-10-19 118 views
38

在Python(2.7)中有更简单的方法吗?:注意:这不是什么奇怪的东西,就像将所有局部变量放入字典中一样。只是我在列表中指定的那些。Python变量作为字典的键

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) 
+1

可以变量在字典中定义?像fruitdict = dict(苹果= 1,香蕉= 2,胡萝卜= 3)? – 2010-10-19 21:27:49

+0

不是真的,每个变量都有很多代码,所以它是不可读的。 – ash 2010-10-19 21:33:01

+0

我假设你知道你的代码不会做你评论说的那样吗?除非你在像locals()这样的命名空间字典中找到你想要的东西,否则你不能从对象向后倒向名称。然而,你可以编写一个函数,在命名空间字典中查找这些变量并将找到的值分配给该键;看jimbob的答案。 – Thomas 2010-10-20 04:35:17

回答

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

单行'dict([(i,locals()[i])为我在('apple','banana','carrot')])'' – dinya 2016-11-29 06:55:44

11

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

对不起,我在编写答案后必须进行编辑。我只需要我指定的变量,而不是所有的本地变量()或全局变量() – ash 2010-10-19 21:33:33

+0

@Jasie:我首先添加了一个简单使用字典的例子,而不是混淆变量。 – 2010-10-19 21:42:34

1

如果你要绑定的变量自己的位置,也就是:

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

谢谢,但数字是随机分配(不需要范围())。 – ash 2010-10-19 21:34:30

4

一个班轮是: -

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

谢谢,但数字是随机分配(不需要范围())。 – ash 2010-10-19 21:33:57

+0

现在有两个列表 – Dantalion 2010-10-19 21:35:15

0

你为什么不反其道而行之:

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

更新locals() “就像那真是邪恶。 – 2010-10-19 21:52:15

+0

正如我的一位朋友所说:'黑暗伏都教' – 2010-10-19 21:56:03

+0

同意,但我对他的问题的理解是,他只想得到__水果和豆类___的变量;这基本上是不可能的,除非他可以教他的程序来区分__fruit和legume__以及其他东西,或者我可能只是让事情复杂化,也许他只想要“胡萝卜,香蕉,苹果”变种:) – mouad 2010-10-19 22:11:46

0

嗯,这是有点,嗯...非Python化... ...难看...... hackish的

这里的代码假设你想创建你 创建局部变量的字典的具体执行检查点之后的片段:

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']列表。但是,如果您正在使用此代码的一个变体,并尝试将当地人().key()的当地人()的快捷键“加入变量,其值将会改变。

副手我想不出有什么方法可以调用诸如new_vars.update()之类的方法来添加/更新键列表。所以for循环是最便携的。我认为字典理解可以用在更新的Python版本中。然而,这个woudl似乎只不过是一轮高尔夫代码而已。

0

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

这是没有什么花哨,像 把所有的局部变量为 字典。

,因为它实际上是“票友”

你想要的是:

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几乎放弃了整个答案,我只是做它完成)

...和喜欢的人的建议,你可能应该在首位的字典把这些,但我会假设由于某种原因,你不能

+0

所以我想我没有看到jimbob的帖子......几乎一样的东西,只是不多次调用当地人/全局信息 – 2010-10-20 00:44:33

+0

我不认为多次调用全局变量实际上会更有效率。 – 2010-10-21 13:27:45

+0

例如,如果你做items = locals(); id(locals())== id(项目)你会得到平等。或者如果你做了items = locals(); b = 3; items ['b']它会找到新的变量b,因为它实际上并没有将本地代码复制到项目中(这会更慢)。如果你已经完成了items = locals()。copy(),可能会有一些细微的差别;但是再次复制步骤可能比访问本地字典中的少量项目要慢。 – 2010-10-21 13:33:26

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

工作。

+0

它应该是'{'a':'something'}'并且你得到了'{'A':'something'}'...你正在编写密钥'A' – DarkCygnus 2017-07-19 17:35:25

0

基于由mouad答案,这里的选择基于前缀的变量更Python的方式:

# 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

这在一条线,而不必重新输入任何变量或它们的值的:

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