2

我有这样的文件:

>>> 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']or k[doc_list[0]][doc_list[1]]

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

这样做的优雅方法是什么?

4

4 回答 4

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'
于 2013-07-22T12:19:10.417 回答
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...

于 2013-07-22T12:23:24.687 回答
1
userkey = 'finance_pl.new.S'
for key in userkey.split('.'):
    k = k[key]
# the final value of k is the one you want

所以基本上只是迭代每个子键并检索内部字典,直到你没有子键

于 2013-07-22T12:23:46.293 回答
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}
>>> 
于 2013-07-22T12:25:19.767 回答