繁体   English   中英

在 Python 中会话多级词典

[英]Conversing Multilevel Dictionary in Python

所以,我正在尝试制作一个程序,其中我有一个如下所示的字典。 问题是,用户应该能够将一个值添加到一个预先存在的字典中——字符串或另一个字典。 我不认为我会遇到那么多麻烦,除非我希望更多的词典能够作为对学生的一种价值,然后将更多的词典添加到其中制作的词典中,等等。所以基本上我赢了我不知道要添加多少词典以及这条线到底有多远,所以我不认为我可以硬编码来添加它?

对不起,如果我没有多大意义,但这个想法基本上是用户将从城市开始并被提示添加城市。 从那里,他们可以“进入”城市并添加一所学校,或者添加一个额外的城市等等。 只是在如何实现这个问题上苦苦挣扎,我不想使用任何类型的导入。

我是 Python 的新手,如果这看起来真的很愚蠢,我很抱歉。

cities = {
    "city_1": {
        "school_1": {
            "class_1":{
                "student_1": {
                    "name": "Joe"
                },
                "student_2": {
                    "name": "Tim"
                }
            }
        },
        "school_2": {
            "class_1": {
                "student_1": {
                    "name": "Joe"
                },
                "student_2": {
                    "name": "Tim"
                }
            }
        }
    },
    "city_2": {
            "school_1": {
                "class_1": {
                    "student_1": {
                        "name": "Sarah"
                    },
                    "student_2": {
                        "name": "Jake"
                    }
                },
                "class_1": {
                    "student_1": {
                        "name": "Sarah"
                    },
                    "student_2": {
                        "name": "Jake"
                    }
                }
            }
    }
}

如果我理解正确,你需要一些方法来处理嵌套字典来执行基本操作。 这不是一项简单的任务,因为您需要编写逻辑来设置、获取、删除和迭代项目。

您可以从Best way to get nested dictionary items开始,但这是获取项目的方法:

def getitem(d, key):
    for level in key:
        d = d[level]
    return d
>>> d = {"a": {"b": {"c": 0}}}
>>> getitem(d, ("a", "b"))
{"c": 0}
>>> getitem(d, ("a", "b", "c"))
0

如何设置项目:

def setitem(d, key, value):
    if not isinstance(key, tuple):
        key = (key,)
    item = d
    for k in key[:-1]:
        item = item.setdefault(k, {})
    item[key[-1]] = value
>>> setitem(d, "b", 2)
>>> d
{'a': {'b': {'c': 0}}, 'b': 2}
>>> setitem(d ("a", "b"), 1)
>>> d
{'a': {'b': 1}, 'b': 2}

如果您想要我提到的其他方法的实现,请查看NestedDict ndicts 中的 NestedDict ndicts (我是作者)。 我从collections.abc MutableMapping class 开始,导入它并定义我的__getitem____setitem____delitem____iter____len__方法的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM