Типы данных list, set и dict в языке Python
Основные типы коллекций: list, set, dict
Python предоставляет три основных встроенных типа для хранения коллекций: список (list), множество (set) и словарь (dict). Каждый из них имеет свои свойства, области применения и методы. Рассмотрим их подробно с примерами кода и разбором типичных ошибок.
Как создать список и добавить в него элементы?
Список - упорядоченная изменяемая коллекция, допускающая дубликаты. Основной способ создания - квадратные скобки или функция list().
fruits = ['apple', 'banana', 'cherry']
numbers = list((1, 2, 3))
print(fruits, numbers)List set dict python (типы данных list, set, dict в python)
['apple', 'banana', 'cherry'] [1, 2, 3]
Добавление одного элемента выполняется методом append(), расширение другим списком - extend().
fruits.append('orange')
fruits.extend(['kiwi', 'mango'])
print(fruits)
['apple', 'banana', 'cherry', 'orange', 'kiwi', 'mango']
Какие существуют альтернативные способы создания списка?
Генератор списка (list comprehension) позволяет создавать списки на основе итерации:
squares = [x**2 for x in range(1, 6)]
print(squares)
[1, 4, 9, 16, 25]
Также можно использовать конструктор с любым итерируемым объектом, например, range() или строкой:
chars = list('hello')
print(chars)
['h', 'e', 'l', 'l', 'o']
Типичные ошибки при работе со списками
Изменение списка во время итерации (например, удаление элементов в цикле for) приводит к пропуску элементов. Решение - итерироваться по копии: for item in list_copy:.
my_list = [1, 2, 3, 4, 5]
for item in my_list[:]: # копия
if item % 2 == 0:
my_list.remove(item)
print(my_list)
[1, 3, 5]
Как создать множество и обеспечить уникальность элементов?
Множество (set) - неупорядоченная коллекция уникальных элементов. Создаётся с помощью фигурных скобок или функции set().
colors = {'red', 'green', 'blue'}
unique_numbers = set([1, 2, 2, 3, 1])
print(colors, unique_numbers)
{'red', 'green', 'blue'} {1, 2, 3}
Как добавить или удалить элемент из множества?
Добавление - метод add(), удаление - remove() или discard() (без ошибки, если элемента нет).
colors.add('yellow')
colors.remove('red')
colors.discard('black') # не возникнет ошибки
print(colors)
{'blue', 'green', 'yellow'}
Ошибка при удалении несуществующего элемента
Метод remove() вызывает KeyError, если элемента нет. Используйте discard(), если не уверены в наличии элемента.
Как создать словарь и получить значение по ключу?
Словарь (dict) - неупорядоченная (в Python 3.6+ упорядоченная) коллекция пар ключ-значение. Создаётся фигурными скобками с двоеточием или функцией dict().
person = {'name': 'Alice', 'age': 30, 'city': 'Moscow'}
print(person['name'])
Alice
Метод get() позволяет безопасно получить значение, вернув None (или значение по умолчанию) вместо ошибки.
print(person.get('salary', 0))
0
Какие есть способы создания словаря?
Из списка кортежей:
items = [('a', 1), ('b', 2)]
d = dict(items)
print(d)
{'a': 1, 'b': 2}
Генератор словаря:
squares = {x: x**2 for x in range(1, 5)}
print(squares)
{1: 1, 2: 4, 3: 9, 4: 16}
Ошибка при обращении к несуществующему ключу
Использование dict[key] для отсутствующего ключа вызывает KeyError. Всегда предпочтительнее использовать get() или проверять наличие через in.
Расширенные примеры работы с коллекциями
Многомерные списки (вложенные списки)
Создание матрицы 3x3 с использованием генератора:
matrix = [[i + j for j in range(3)] for i in range(3)]
print(matrix)
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
Обращение к элементу: matrix[1][2] даст 3.
Операции над множествами
Объединение, пересечение, разность:
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print('union:', a | b)
print('intersection:', a & b)
print('difference a-b:', a - b)
print('symmetric diff:', a ^ b)
union: {1, 2, 3, 4, 5, 6}
intersection: {3, 4}
difference a-b: {1, 2}
symmetric diff: {1, 2, 5, 6}
Проверка подмножества: a.issubset(b) или a <= b.
Неизменяемое множество (frozenset)
Используется как ключ в словаре или элемент другого множества:
frozen = frozenset([1, 2, 3])
print(frozen)
# frozen.add(4) # ошибка: AttributeError
frozenset({1, 2, 3})
Словарь с значениями по умолчанию (defaultdict)
Модуль collections.defaultdict упрощает работу с отсутствующими ключами:
from collections import defaultdict
word_count = defaultdict(int)
words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
for w in words:
word_count[w] += 1
print(dict(word_count))
{'apple': 3, 'banana': 2, 'cherry': 1}
Упорядоченный словарь (OrderedDict)
Хотя стандартный dict в Python 3.7+ сохраняет порядок вставки, OrderedDict предоставляет дополнительные методы, например, move_to_end():
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2)])
od.move_to_end('a')
print(od)
OrderedDict([('b', 2), ('a', 1)])
Преобразование между типами коллекций
my_list = [1, 2, 2, 3]
my_set = set(my_list) # {1, 2, 3}
my_dict = dict.fromkeys(my_list, 0) # {1:0, 2:0, 3:0}
print(my_set)
print(my_dict)
{1, 2, 3}
{1: 0, 2: 0, 3: 0}
Глубокое копирование изменяемых объектов
Поверхностная копия (copy()) не копирует вложенные объекты. Для полной независимости используйте deepcopy:
import copy
original = {'key': [1, 2, [3, 4]]}
shallow = original.copy()
deep = copy.deepcopy(original)
original['key'][2][0] = 99
print('original:', original)
print('shallow:', shallow)
print('deep:', deep)
original: {'key': [1, 2, [99, 4]]}
shallow: {'key': [1, 2, [99, 4]]}
deep: {'key': [1, 2, [3, 4]]}
Использование множества для удаления дубликатов из списка с сохранением порядка
Простое преобразование в set теряет порядок. Для сохранения порядка используйте цикл с проверкой:
items = [3, 1, 2, 1, 3, 4]
seen = set()
unique = []
for item in items:
if item not in seen:
seen.add(item)
unique.append(item)
print(unique)
[3, 1, 2, 4]