2010-10-19 167 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'})