首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用["key“、”key2“)访问

使用["key“、”key2“)访问
EN

Stack Overflow用户
提问于 2016-11-21 20:01:39
回答 3查看 87关注 0票数 0

我正在开发python实用程序。其中的一部分是生成一个文件索引。

在python中是否可以在不知道深度的情况下动态地访问多维字典。

如果我有示例数据:

example = {'main': {'2': {'2': '2-2', '1': '2-1'}, '1': {'2': '1-2', '1': '1-1'}}}

是否有一种方法可以使用类似于example["main","2","1"]的东西访问元素并返回2-1?我知道我可以写我自己的潜水算法,但我的经验表明,你不能写到这个值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-21 20:17:02

如果您确实需要这样做,那么您将需要滚出自己的dict类。幸运的是,除了__getitem__之外,您可以从dict继承所有东西。

代码语言:javascript
运行
复制
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"}的key/vals。可能看起来像..。

代码语言:javascript
运行
复制
...
        for i, key in enumerate(keys):
            if keys[i:] in cur:
                return cur[keys[i:]]
            cur = cur.get(key, {})

然后,您可以将您的映射转换到这个新的dict并以这种方式进行搜索。

代码语言:javascript
运行
复制
example = {'main': {'2': {'2': '2-2', '1': '2-1'}, '1': {'2': '1-2', '1': '1-1'}}}
result = MyDict2(example)['2', '2', '1']

您还提到了必须通过此设置值,在这种情况下也继承了__setitem__

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-11-21 20:06:04

您可以这样做一个函数:

代码语言:javascript
运行
复制
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

如果您想修改最后一个索引的值,您可以这样做。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2016-11-21 20:29:34

您还可以将@Arya提出的想法封装在派生的dict类中,例如:

代码语言:javascript
运行
复制
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']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40728361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档