В Python словари — это универсальная и мощная структура данных, которая позволяет хранить и извлекать данные с использованием пар ключ-значение. В отличие от списков или кортежей, которые используют числовые индексы для доступа к элементам, словари используют ключи в качестве уникальных идентификаторов. Это делает словари невероятно удобными, когда вам нужно сопоставить значения с определенными ключами или выполнить эффективный поиск.

Создать словарь очень просто; вы используете фигурные скобки {} и разделяете каждую пару ключ-значение двоеточием. Например

my_dict = {'key1': value1, 'key2': value2, 'key3': value3}.

Эта фундаментальная концепция словарей в Python является краеугольным камнем для различных операций в задачах программирования. Теперь мы изучим основы операций CRUD, используя их встроенные методы.

Создание словарей

Словари Python — это структуры данных, в которых хранятся пары ключ-значение. Есть несколько способов создания словарей в Python.

  1. Кудрявые скобки {} с парами "ключ-значение"

Самый распространенный способ создания словаря — использование фигурных скобок для заключения пар ключ-значение, разделенных двоеточиями.

person = {
    "name": "John Doe",
    "age": 30,
    "city": "New York"
}

# {'name': 'John Doe', 'age': 30, 'city': 'New York'}

2. Использование списка

Вы можете использовать понимание списка, чтобы создать словарь из списка пар ключ-значение. Это полезно, если вы хотите преобразовать или отфильтровать элементы перед созданием словаря:

keys = ["name", "age", "city"]
values = ["Alice Johnson", 28, "Los Angeles"]
person = {key: value for key, value in zip(keys, values)}

# {'name': 'Alice Johnson', 'age': 28, 'city': 'Los Angeles'}

3. Понимание словаря

Подобно генераторам списков, вы также можете создавать словари, используя генераторы словарей. Это предполагает создание нового словаря путем краткого указания ключей и значений:

keys = ["name", "age", "city"]
values = ["Michael Brown", 35, "Chicago"]
person = {keys[i]: values[i] for i in range(len(keys))}

# {'name': 'Michael Brown', 'age': 35, 'city': 'Chicago'}

4. Конструктор dict()

Вы можете использовать встроенный конструктор dict() для создания словаря из последовательности пар ключ-значение или из другого словаря.

dict(name="Jane Smith", age=25, city="San Francisco") 

# {'name': 'Jane Smith','age': 25, 'city': 'San Francisco'}

Вы также можете создать словарь из списка кортежей, используя конструктор dict():

dict([
    ("name", "Alice"),
    ("age", 30),
    ("occupation", "Engineer")
])

# {'name': 'Alice', 'age': 30, 'occupation': 'Engineer'}

5. Использование метода fromkeys()

Метод fromkeys() создает новый словарь с указанными ключами и значением по умолчанию для каждого ключа:

синтаксис: dictionary.fromkeys(keys, value)

value — Необязательно. Значение для всех ключей. Значение по умолчанию: Нет.

# Using the fromkeys() method
keys = ["name", "age"]
default_value = "Not Available"

dict.fromKeys(keys) #{'name': None, 'age': None}
dict.fromkeys(keys, default_value) # {'name': 'Not Available', 'age': 'Not Available'}

6.Использование функции zip()

Функцию zip() можно использовать для объединения двух или более последовательностей в пары, которые затем можно использовать для создания словаря:

keys = ["name", "age", "city"]
values = ["Sophia Williams", 22, "Houston"]
dict(zip(keys, values))

# {'name': 'Sophia Williams', 'age': 22, 'city': 'Houston'}

Чтение словарей

Далее, переходя к чтению данных в словарях Python, у вас есть различные методы доступа к значениям.

  1. Использование квадратных скобок [ ]

Вы можете получить доступ к значениям из словаря, используя ключи в качестве индекса в квадратных скобках.

countries = {
    "USA": "New York",
    "Japan": "Tokyo",
    "France": "Paris"
}

countries["USA"]      # New York
countries["Japan"]    # Tokyo
countries["France"]   # Paris

person.name  # This will result in an AttributeError

2. Использование метода get()

Метод get() позволяет получить значение из словаря с помощью ключа. Он также предоставляет значение по умолчанию, если ключ отсутствует.

синтаксис: dictionary.get(keyname, value)

value —Необязательно. Значение, возвращаемое, если указанный ключ не существует.
Значение по умолчанию Нет

cities = {
    "Germany": "Berlin",
    "China": "Beijing"
}

cities.get("Germany") # Berlin
cities.get("India") # None if default value isn't provided
cities.get("USA", "City not found") # "City not found" 

3. Использование методов keys() и values()

Метод keys() возвращает список всех ключей словаря, а метод values() возвращает список всех значений. Эти методы могут быть полезны, когда вам нужно работать только с ключами или значениями.

синтаксис: dictionary.keys() и dictionary.values()

countries = {
    "Mexico": "Mexico City",
    "United Kingdom": "London",
    "Russia": "Moscow"
}

countries.keys() # dict_keys(['Mexico', 'United Kingdom', 'Russia'])
countries.values() # dict_values(['Mexico City', 'London', 'Moscow'])

4. Использование метода items():

Метод items() возвращает список кортежей, каждый из которых состоит из ключа и соответствующего ему значения. Вы можете использовать этот метод для перебора как ключей, так и значений.

countries = {
    "Canada": "Toronto",
    "Italy": "Rome"
}

countries.items() # dict_items([('Canada', 'Toronto'), ('Italy', 'Rome')])

5. Использование цикла (for…in)

Вы можете перебирать ключи словаря и получать соответствующие значения с помощью цикла.

countries = {
    "Brazil": "Rio de Janeiro",
    "Australia": "Sydney"
}

for country in countries:
    city = countries[country]
    print(f"The city in {country} is {city}")

# The city in Brazil is Rio de Janeiro
# The city in Australia is Sydney

Обновление словарей

Словари Python изменяемы, что означает, что вы можете обновлять их содержимое после создания. Вот различные способы обновления словарей.

# dictionary with car information
car = {
    "make": "Toyota",
    "model": "Camry",
    "year": 2020
}
# {'make': 'Toyota', 'model': 'Camry', 'year': 2020}
  1. Использование квадратных скобок [ ]

Вы можете использовать квадратные скобки для обновления или добавления значений в словарь, напрямую присваивая значение определенному ключу.

car["year"] = 2021 # update an existing value
car["color"] = "Blue"  # or make a new one

# car = {'make': 'Toyota', 'model': 'Camry', 'year': 2021, 'color': 'Blue'}

2. Использование метода update()

Метод update() позволяет объединить содержимое одного словаря с другим. В качестве аргумента он может принимать либо другой словарь, либо итерацию пар ключ-значение:

additional_data = {
    "year": 2022,      # Update year
    "mileage": 15000  # Add mileage
}
car.update(additional_data)

# car = {'make': 'Toyota', 'model': 'Camry', 'year': 2022, 'mileage': 15000}

Помните, что если вы попытаетесь обновить несуществующий ключ, используя квадратные скобки, Python добавит этот ключ с присвоенным значением. Однако если вы используете метод update(), метод will not create new keys. Также важно отметить, что ключи словаря уникальны, поэтому попытка добавить дубликат ключа приведет к перезаписи существующего значения.

3. Использование метода setdefault()

Метод setdefault() используется для вставки ключа со значением по умолчанию, если он не существует в словаре. Этот метод также используется для чтения данных. Он возвращает значение ключа, независимо от того, был ли он недавно вставлен или уже существовал.

car.setdefault("year",2023) #return 2020 since its alreay in the dictioanry
car.setdefault("previous_owners", 2)  # Adding a new key with a default value

# car = {'make': 'Toyota', 'model': 'Camry', 'year': 2020, 'previous_owners': 2}

4. Использование конструктора dict()

Вы также можете создать новый словарь, объединив два или более словарей или пары ключ-значение с помощью конструктора dict().

new_data = {
    "model": "Corolla",  # Update model
    "color": "Red"       # Update color
}
updated_car = dict(car, **new_data)

car # {'make': 'Toyota', 'model': 'Camry', 'year': 2020}
updated_car # {'make': 'Toyota', 'model': 'Corolla', 'year': 2020, 'color': 'Red'}

5. Использование метода .union()

Объединение двух словарей означает объединение ключей и значений из обоих словарей в один словарь. В Python 3.9 появился оператор | как сокращение для объединения словарей. Вот как вы можете использовать метод .union() и оператор |.

# Original dictionaries
car_data_one = {
    "make": "Toyota",
    "model": "Camry"
}

car_data_two = {
    "model": "Corolla",
    "color": "Blue"
}

union_car_data = car_data_one | car_data_two 
                              # or car_data_one.union(car_data_two)


union_car_data # {'make': 'Toyota', 'model': 'Corolla', 'color': 'Blue'}

Удаление словарей

Любое творение может быть уничтожено, и это относится даже к словарям Python. Вот способы добиться этого

groceries = {"apples": 5, "bananas": 10, "bread": 2}
  1. Использование оператора del

Вы можете использовать оператор del, чтобы полностью удалить словарь или удалить определенную пару ключ-значение.

del groceries["bananas"]  # Delete the "bananas" key and its value

groceries # {'apples': 5, 'bread': 2}

del groceries  # Delete the entire 'groceries' dictionary

groceries # NameError: name 'groceries' is not defined

2.Использование метода clear()

Метод clear() используется для удаления всех пар ключ-значение из словаря, фактически очищая его.

groceries.clear()  # Removes all key-value pairs from the 'groceries'

groceries # {}

3. Использование метода pop()

Метод pop() используется для удаления ключа из словаря и возврата связанного с ним значения. Вы можете указать значение по умолчанию, если ключ не существует.

синтаксис dictionar.pop(keyname, defaultvalue)

defaultvalueНеобязательно. Значение, возвращаемое, если указанный ключ не существует.

Если этот параметр не указан и элемент с указанным ключом не найден, возникает ошибка.

 
# Remove "bananas" key and get its value
groceries.pop("bananas") # 10

# Remove nonexistent key with default value 0
groceries.pop("nonexistent_key", 0)  # 0

# Remove nonexistent key without default value
groceries.pop("nonexistent_key")  # KeyError: 'nonexistent_key'

4. Использование метода popitem()

Метод popitem() удаляет и возвращает произвольную пару ключ-значение из словаря. Это полезно, если вы хотите удалить элементы из словаря в порядке LIFO (последний вошел, первый вышел).

В версиях до 3.7 метод popitem() удаляет случайный элемент.

синтаксис dictionary.popitem()

groceries.popitem()  # groceries.popitem() 

# what if dictionary is empty 

empty_dict = {}
empty_dict.popitem() # groceries.popitem() 

Копирование словарей

Подобно писцу, тщательно копирующему древние рукописи, вы можете создавать дубликаты словарей Python, используя различные методы.

pokemons = {"Pikachu": "Electric", "Charmander": "Fire", "Squirtle": "Water"}
  1. Использование метода copy()

Метод copy() создает неполную копию словаря, что означает, что ключи и значения копируются, но если сами значения являются изменяемыми объектами (например, списками), копируются ссылки на эти объекты, а не сами объекты.

clone = pokemons.copy() # {'Pikachu': 'Electric', 'Charmander': 'Fire', 'Squirtle': 'Water'}

# updating the values affects both the dict
clone['Pikachu'] = "Grass"

pokemons # {'Pikachu': 'Electric', 'Charmander': 'Fire', 'Squirtle': 'Water'}
clone    # {'Pikachu': 'Grass', 'Charmander': 'Fire', 'Squirtle': 'Water'}
# effect of swallow copy

pokemons = { 0 : ["Pikachu","Electric"], 1 : ["Charmander","Fire"]}

clone = pokemons.copy() # try using copy.deepcopy() instead

clone[0][1] = "Grass"

pokemons # {0: ['Pikachu', 'Grass'], 1: ['Charmander', 'Fire']}
clone # {0: ['Pikachu', 'Grass'], 1: ['Charmander', 'Fire']}

2.Использование конструктора dict()

Вы можете создать новый словарь, передав существующий словарь конструктору dict(). Это создает новый словарь с теми же парами ключ-значение.

# which doesn't have any side effects like copy()

clones = dict(pokemons)   # {'Pikachu': 'Electric', 'Charmander': 'Fire', 'Squirtle': 'Water'}

3.Использование словарного понимания

Вы можете создать копию словаря, используя словарное понимание. Этот метод позволяет фильтровать или преобразовывать ключи и значения в процессе копирования.

# Has the same behaviour like copy()
# that is, it performs shallow copy

clones = {name: type for name, type in pokemons.items()} 
# {'Pikachu': 'Electric', 'Charmander': 'Fire', 'Squirtle': 'Water'}

4. Использование распаковки словаря

Вы можете создать копию словаря, распаковав его пары ключ-значение в новый словарь и выполнив поверхностное копирование.

# it performs shallow copy
clones = {**pokemons} # {'Pikachu': 'Electric', 'Charmander': 'Fire', 'Squirtle': 'Water'}

5.Использование метода copy() с вложенными объектами

Если ваш словарь содержит изменяемые объекты (например, списки) и вы хотите создать настоящую независимую копию (глубокую копию), вы можете использовать функцию copy.deepcopy() из модуля copy.

import copy

pokemons = { 0 : ["Pikachu","Electric"], 1 : ["Charmander","Fire"]}

clone = copy.deepcopy(pokemons) 

clone[0][1] = "Grass"

pokemons # {0: ['Pikachu', 'Electric'], 1: ['Charmander', 'Fire']}
clone # {0: ['Pikachu', 'Grass'], 1: ['Charmander', 'Fire']}

Абсолютно! 🪄 Словари Python — это волшебные книги заклинаний для программистов. Они помогут вам управлять данными в парах «ключ-значение» — очень удобно для организации вещей.

Мы совершили экскурсию по созданию этих волшебников 🧙‍♂️, заглядывали в их секреты 🔍, меняли заклинания на лету ✨ и даже стирали чары 🧹. Кроме того, мы научились нескольким изящным трюкам копирования, позволяющим создавать новые книги заклинаний 📚, не испортив старые.

Имея в запасе эти хитрости, вы в кратчайшие сроки станете словарным волшебником! 🎩🔮

На этом сегодняшняя порция идей Python подошла к концу! 👋 Пора прощаться, ребята. Помните: кодируйте с радостью, и пусть ваши приключения на Python будут такими же гладкими, как хорошо смазанная машина! 🚀 Оставайтесь любопытными и продолжайте программировать! А сейчас до свидания! 👋👋