2013-07-22 113 views
2

我有一個這樣的文件:Python列表訪問字典直接

>>> k = {'finance_pl':{'S':{'2008':45,'2009':34}}} 

訪問普通的方法是:

>>> k['finance_pl']['S'] 
{'2008': 45, '2009': 34} 

但是,在我的情況下,終端用戶可以給我輸入爲finance_pl.S

我可以拆分這一點,查閱字典是這樣的:

>>> doc_list = doc.split('.') 
>>> k[doc_list[0]][doc_list[1]] 
{'2008': 45, '2009': 34} 

但是,我不想這樣做,因爲字典結構可能會改變和 用戶可以給這樣的東西finance_pl.new.S而不是k['finance_pl']['S']k[doc_list[0]][doc_list[1]]。 (例如:如果輸入是finance_pl.new.S,我應該可以將這個.split('.')方法應用於用戶輸入並直接應用)。我需要一些東西來直接應用用戶輸入(例如:如果輸入是finance_pl.new.S,我應該能夠將這個.split('.')方法應用於用戶輸入並直接應用)。

什麼是優雅的方式來做到這一點?

+1

不知道我是否理解正確的問題,即是否有更多的,但我想你應該看看這個[相關問題](http://stackoverflow.com/q/12414821/1639625) –

+1

我回答了類似的問題[這裏](http://stackoverflow.com/questions/14923465/python-how-to-return-a-default-value/14 923509#14923509)我認爲它會幫助你。此外,請參閱[喬恩的答案](http://stackoverflow.com/a/17787473/1561176)這是我將如何回答你的問題。 –

+0

是的,@InbarRose你是對的。這正是我需要的。 –

回答

1
>>> k = {'finance_pl':{'S':{'2008':45,'2009':34}}} 
>>> ui = 'finance_pl.S' 
>>> def getter(adict, key): 
...  return reduce(dict.get, key.split('.'), adict) 
... 
>>> getter(k, ui) 
{'2008': 45, '2009': 34} 
>>> 
5

我想簡單地遍歷所有的部件:

def getter(somedict, key): 
    parts = key.split(".") 
    for part in parts: 
     somedict = somedict[part] 
    return somedict 

之後我們有

>>> getter(k, "finance_pl.S") 
{'2008': 45, '2009': 34} 

>>> getter({"a": {"b": {"c": "d"}}}, "a") 
{'b': {'c': 'd'}} 
>>> getter({"a": {"b": {"c": "d"}}}, "a.b.c") 
'd' 
+0

謝謝@DSM,易於理解的解決方案。 –

2

你可以去這樣的事情:

k = {'finance_pl':{'S':{'2008':45,'2009':34}}} 
print reduce(dict.__getitem__, 'finance_pl.S.2009'.split('.'), k) 
# 34 

如果你使用的是Python 3.x中,你需要在那裏from functools import reduce ...

1
userkey = 'finance_pl.new.S' 
for key in userkey.split('.'): 
    k = k[key] 
# the final value of k is the one you want 

所以基本上只是遍歷每個子項和檢索內部字典,直到你的子項