直接访问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}
>>>