直接访问dict的Python列表

直接访问dict的Python列表,python,Python,我有这样一份文件: >>> k = {'finance_pl':{'S':{'2008':45,'2009':34}}} >>> doc_list = doc.split('.') >>> k[doc_list[0]][doc_list[1]] {'2008': 45, '2009': 34} 通常的访问方式是: >>> k['finance_pl']['S'] {'2008': 45, '2009': 34} 但是,

我有这样一份文件:

>>> k = {'finance_pl':{'S':{'2008':45,'2009':34}}}
>>> doc_list = doc.split('.')
>>> k[doc_list[0]][doc_list[1]]
{'2008': 45, '2009': 34}
通常的访问方式是:

>>> k['finance_pl']['S']
{'2008': 45, '2009': 34}
但是,在我的情况下,最终用户将以
finance\u pl.S

我可以拆分此文件并按如下方式访问字典:

>>> k = {'finance_pl':{'S':{'2008':45,'2009':34}}}
>>> doc_list = doc.split('.')
>>> k[doc_list[0]][doc_list[1]]
{'2008': 45, '2009': 34}
但是,我不想这样做,因为字典结构可能会改变和 用户可以提供类似以下内容的
finance\u pl.new.S
,而不是
k['finance\u pl']['S']
k[doc\u list[0]][doc\u list[1]

我需要一些东西来直接应用用户输入(例如:如果输入是
finance\u pl.new.S
,我应该能够将此
.split('.')
方法应用于用户输入并直接应用)


做这件事的优雅方式是什么?

我只需简单地在所有部分上循环:

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}


你可以选择以下方式:

k = {'finance_pl':{'S':{'2008':45,'2009':34}}}
print reduce(dict.__getitem__, 'finance_pl.S.2009'.split('.'), k)
# 34
如果您使用的是Python3.x,则需要functools import reduce中的

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

因此,基本上只需迭代每个子键并检索内部字典,直到子键用完

不确定我是否正确理解了这个问题,也就是说,是否还有更多的问题,但我认为你应该看看这个问题。我回答了一个类似的问题,我认为这会对你有所帮助。还有,看看我会怎样回答你的问题。是的,你是对的。这正是我需要的。是的,@tobias_k我只需要这样的东西。谢谢@DSM,简单易懂的解决方案。
>>> 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}
>>>