2013-07-22 68 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 

所以基本上只是遍历每个子项和检索内部字典,直到你的子项