CodeGym /課程 /Python SELF TW /巢狀字典

巢狀字典

Python SELF TW
等級 11 , 課堂 7
開放

7.1 建立巢狀字典

巢狀字典是描述複雜資料結構的一個超方便方法,你會常常遇到它們。讓我們來練習一下怎麼創建它們。

創建巢狀字典

這是創建巢狀字典的例子:


person = {
    "name": "Alice",
    "details": {
        "age": 25,
        "city": "New York",
        "address": {
            "street": "123 Main St",
            "zip": "10001"
        },
        "mother": "Jane Smith"
    },
    "gender": "female"
}
print(person)  # 輸出: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}, 'mother': 'Jane Smith'}, 'gender': 'female'}

在這個例子中,person 是一個字典,包含了一個巢狀字典 details,它又包含了一個巢狀字典 address

巢狀字典也可以從小片段中創建:


address = {
    "street": "123 Main St",
    "zip": "10001"
}
         
details = {
    "age": 25,
    "city": "New York",
    "address": address
}
         
person = {
    "name": "Alice",
    "details": details,
    "gender": "female"
}
print(person)  # 輸出: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}}, 'gender': 'female'}

7.2 存取巢狀字典的元素

存取巢狀字典的元素很簡單,這樣做:

存取最上層的元素


name = person["name"]
print(name)  # 輸出: Alice

存取巢狀字典的元素


age = person["details"]["age"]
city = person["details"]["city"]
print(age)  # 輸出: 25
print(city)  # 輸出: New York

存取更深一層的元素


street = person["details"]["address"]["street"]
zip_code = person["details"]["address"]["zip"]
print(street)  # 輸出: 123 Main St
print(zip_code)  # 輸出: 10001

7.3 修改巢狀字典的元素

如果你掌握了如何輸出任何層次的元素,那麼修改它們就更簡單了:

修改最上層的值


person["name"] = "Bob"
print(person["name"])  # 輸出: Bob

修改巢狀字典的值


person["details"]["age"] = 26
print(person["details"]["age"])  # 輸出: 26

修改更深層的值


person["details"]["address"]["city"] = "Los Angeles"
print(person["details"]["address"]["city"])  # 輸出: Los Angeles

添加新元素到巢狀字典


person["details"]["phone"] = "123-456-7890"
print(person["details"]["phone"])  # 輸出: 123-456-7890

刪除最上層的元素


# 從字典 'person' 中刪除元素 'country'
del person["country"]
print(person)  # 元素 'country' 會被從字典中刪除

刪除巢狀字典的元素


# 從字典 'details' 中刪除元素 'phone'
del person["details"]["phone"]
print(person["details"])  # 元素 'phone' 會被從字典 'details' 中刪除

7.4 遍歷巢狀字典

有好幾種方法可以遍歷字典的所有元素。循環是最簡單的一種:

迭代巢狀字典的元素


for key, value in person.items():  # 遍歷父字典
    if isinstance(value, dict):  # 如果值是字典
        for key2, value2 in value.items():  # 遍歷子字典的元素
            print(f"{key} --> {key2}: {value2}")

遞迴迭代所有層次


def print_dict(d, indent=0):
    for key, value in d.items():
        print("  " * indent + str(key) + ": ", end="")
        if isinstance(value, dict):
            print()
            print_dict(value, indent + 1)
        else:
            print(value)
        
print_dict(person)

更多關於遞迴的資訊可以在「演算法與資料結構」主題中學到。

順帶一提,遞迴用來在巢狀字典中查找值非常方便。這裡有一個例子:


def find_key(d, key):
    if key in d:
        return d[key]
    for k, v in d.items():
        if isinstance(v, dict):
            result = find_key(v, key)
            if result:
                return result
    return None
        
phone = find_key(person, "phone")
print(phone)  # 輸出: None (因為元素 'phone' 已經被刪除)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION