使用[" key"," key2"]访问Python Dictionarys

时间:2016-11-21 20:01:40

标签: python dictionary

我正在开发一个python实用程序。部分原因是生成文件索引 在python中是否可以在不知道深度的情况下动态访问多维字典 即如果我有示例数据:
example = {'main': {'2': {'2': '2-2', '1': '2-1'}, '1': {'2': '1-2', '1': '1-1'}}}
有没有办法可以访问类似的东西 example["main","2","1"]并返回2-1? 我知道我可以编写自己的潜水算法,但我的经验表明你不能写出这个值。

3 个答案:

答案 0 :(得分:1)

你可以制作这样的函数:

def get_item(d, keys):
    current = d
    for k in keys:
        current = current[k] # You can add some error handling here
    return current

使用示例:https://repl.it/E49o/1

如果要修改最后一个索引的值,可以执行以下操作。

def set_item(d, keys, new_value):
    current = d
    for k in keys[:-1]: # All the keys except the last one
        current = current[k] 
    current[keys[-1]] = new_value

答案 1 :(得分:1)

如果你绝对需要这样做,那么你需要推出自己的dict课程。幸运的是,您可以从__getitem__继承dict以外的所有内容。

class MyDict(dict):
    def __getitem__(self, keys):
        if isinstance(keys, str):
            # this special-case saves you if you try to do normal indexing
            # on a string.
            return super().__getitem__(keys)
        cur = self
        for key in keys:
            cur = cur.get(key, {})
            # the default option here returns an empty dict instead
            # of raising a KeyError. That might not be what you want
        return cur

请注意,这会删除您通过元组键入的功能,因此除非特别编码,否则{("some", "tuple", "values"): "any value"}之类的键/值将无法访问。这可能看起来像......

...
        for i, key in enumerate(keys):
            if keys[i:] in cur:
                return cur[keys[i:]]
            cur = cur.get(key, {})

然后,您可以将映射转换为此新dict并以此方式进行搜索。

example = {'main': {'2': {'2': '2-2', '1': '2-1'}, '1': {'2': '1-2', '1': '1-1'}}}
result = MyDict2(example)['2', '2', '1']

你提到必须按此设置值,在这种情况下也会继承__setitem__

class MyDict(dict):
    def __getitem__(self, keys):
        # as above
    def __setitem__(self, keys, value):
        if isinstance(keys, str):
            super().__setitem__(keys, value)
        cur = self
        for key in keys[:-1]:
            cur = cur.setdefault(key, {})
        cur[keys[-1]] = value

答案 2 :(得分:1)

你也可以将@Arya提出的想法包含在派生的dict类中,例如:

class ListAccess(dict):
    def __getitem__(self, item):
        if type(item) in [tuple,list]:
            item = list(item)
            ret = self
            while True:
                try:
                    ret = ret[item.pop(0)]
                except IndexError:
                    break
            return ret
        else:
            return super(ListAccess, self).__getitem__(item)

store = ListAccess({'main': {'2': {'2': '2-2', '1': '2-1'}, '1': {'2': '1-2', '1': '1-1'}}})
print store['main','2','1']