我有这样的文件:
>>> 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('.')
方法应用于用户输入并直接应用。)
这样做的优雅方法是什么?
答案 0 :(得分: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'
答案 1 :(得分: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
...
答案 2 :(得分:1)
userkey = 'finance_pl.new.S'
for key in userkey.split('.'):
k = k[key]
# the final value of k is the one you want
所以基本上只是迭代每个子键并检索内部字典,直到你没有子键
答案 3 :(得分: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}
>>>