在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"
}
}
}
}
}

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

您可以从获取嵌套字典项的最佳方法开始,但这里是获取项的方法:

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}

如果您想要我提到的其他方法的实现,请检查包ndicts中的NestedDict类(我是作者)。我从收藏开始。abcMutableMapping类,导入并定义了__getitem____setitem____delitem____iter____len__方法的逻辑。

相关内容

  • 没有找到相关文章

最新更新