簡體   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