CodeGym /コース /Python SELF JA /ネストされた辞書

ネストされた辞書

Python SELF JA
レベル 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