7.1 Tworzenie zagnieżdżonych słowników
Zagnieżdżone słowniki to bardzo wygodny sposób opisu skomplikowanej struktury danych, z którym często będziesz się spotykał. Poćwiczmy trochę ich tworzenie.
Tworzenie zagnieżdżonych słowników
Oto przykład tworzenia zagnieżdżonego słownika:
person = {
"name": "Alice",
"details": {
"age": 25,
"city": "New York",
"address": {
"street": "123 Main St",
"zip": "10001"
},
"mother": "Jane Smith"
},
"gender": "female"
}
print(person) # Wyświetli: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}, 'mother': 'Jane Smith'}, 'gender': 'female'}
W tym przykładzie person
to słownik zawierający zagnieżdżony słownik details
, który z kolei zawiera inny zagnieżdżony słownik address
.
Zagnieżdżony słownik można stworzyć także z kawałków:
address = {
"street": "123 Main St",
"zip": "10001"
}
details = {
"age": 25,
"city": "New York",
"address": address
}
person = {
"name": "Alice",
"details": details,
"gender": "female"
}
print(person) # Wyświetli: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}}, 'gender': 'female'}
7.2 Dostęp do elementów zagnieżdżonego słownika
Dostęp do elementów zagnieżdżonych słowników jest prosty i oczywisty. Oto jak to się robi:
Dostęp do elementów poziomu najwyższego
name = person["name"]
print(name) # Wyświetli: Alice
Dostęp do elementów zagnieżdżonego słownika
age = person["details"]["age"]
city = person["details"]["city"]
print(age) # Wyświetli: 25
print(city) # Wyświetli: New York
Dostęp do elementów głębszego poziomu zagnieżdżenia
street = person["details"]["address"]["street"]
zip_code = person["details"]["address"]["zip"]
print(street) # Wyświetli: 123 Main St
print(zip_code) # Wyświetli: 10001
7.3 Zmiana elementów zagnieżdżonego słownika
Jeśli już wiesz, jak wyświetlić elementy dowolnego stopnia zagnieżdżenia, to zmienianie ich będzie jeszcze prostsze:
Zmiana wartości poziomu najwyższego
person["name"] = "Bob"
print(person["name"]) # Wyświetli: Bob
Zmiana wartości zagnieżdżonego słownika
person["details"]["age"] = 26
print(person["details"]["age"]) # Wyświetli: 26
Zmiana wartości głębszego poziomu zagnieżdżenia
person["details"]["address"]["city"] = "Los Angeles"
print(person["details"]["address"]["city"]) # Wyświetli: Los Angeles
Dodawanie nowych elementów do zagnieżdżonego słownika
person["details"]["phone"] = "123-456-7890"
print(person["details"]["phone"]) # Wyświetli: 123-456-7890
Usuwanie elementów poziomu najwyższego
# Usuwamy element 'country' ze słownika 'person'
del person["country"]
print(person) # Element 'country' zostanie usunięty ze słownika
Usuwanie elementów z zagnieżdżonego słownika
# Usuwamy element 'phone' ze słownika 'details'
del person["details"]["phone"]
print(person["details"]) # Element 'phone' zostanie usunięty ze słownika 'details'
7.4 Przechodzenie zagnieżdżonych słowników
Istnieje kilka sposobów na przejście przez wszystkie elementy słownika. Pętle są najprostszym z nich:
Iteracja po elementach zagnieżdżonego słownika
for key, value in person.items(): # Przechodzimy przez rodzicielski słownik
if isinstance(value, dict): # Jeśli wartość jest słownikiem
for key2, value2 in value.items(): # Przechodzimy przez elementy potomnego słownika
print(f"{key} --> {key2}: {value2}")
Rekurencyjna iteracja po wszystkich poziomach zagnieżdżenia
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)
Więcej na temat rekurencji dowiesz się z tematu „Algorytmy i Struktury danych”.
Przy okazji, rekurencję można wygodnie używać do wyszukiwania wartości głęboko we zagnieżdżonych słownikach. Oto przykład:
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) # Wyświetli: None (ponieważ element 'phone' został usunięty)
GO TO FULL VERSION