Когда вы только начинаете программировать, первое искушение — завести переменную для всего: число1, число2, число3… Очень быстро код превращается в кашу. Python предлагает элегантное решение: списки и словари. Они позволяют хранить коллекции данных, обрабатывать их циклами и писать код, который понятен с первого взгляда.
В этой статье разберём:
- как создать и изменять список,
- когда использовать словарь вместо списка,
- основные методы работы с ними,
- типичные ошибки новичков.
1. Список: упорядоченный набор чего угодно
Список в Python — это упорядоченная коллекция, которая может содержать любые типы данных: числа, строки, даже другие списки. Создаётся квадратными скобками:
fruits = ["яблоко", "банан", "апельсин"]
numbers = [1, 2, 3, 4, 5]
mixed = [42, "привет", 3.14, [1, 2]]
Доступ к элементам
Индексация начинается с нуля:
python
print(fruits[0]) # яблоко
print(fruits[-1]) # апельсин (отрицательный индекс — с конца)
Изменение и добавление
Список изменяем:
fruits[1] = "манго" # замена
fruits.append("киви") # добавить в конец
fruits.insert(1, "груша") # вставить на позицию 1
Удаление
del fruits[0] # удалить по индексу
fruits.remove("апельсин") # удалить по значению
last = fruits.pop() # удалить и вернуть последний
Перебор элементов
Цикл for делает код лаконичным:
for fruit in fruits:
print(fruit)
Если нужен и индекс, и значение — используйте enumerate:
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
2. Словарь: храним данные с понятными именами
Словарь — это неупорядоченная коллекция пар «ключ — значение». Ключи обычно строки, но могут быть и числа, а значения — любые типы. Создаётся фигурными скобками:
person = {
"name": "Анна",
"age": 28,
"city": "Москва"
}
Доступ к значениям
print(person["name"]) # Анна
print(person.get("age")) # 28, безопасный доступ
print(person.get("job", "не указано")) # вернёт "не указано", если ключа нет
Добавление и изменение
person["job"] = "разработчик" # новый ключ
person["age"] = 29 # изменить существующий
Удаление
del person["city"] # удалить ключ
age = person.pop("age") # удалить и вернуть значение
Перебор
# по ключам
for key in person:
print(key, person[key])
# по парам (ключ, значение)
for key, value in person.items():
print(f"{key}: {value}")
3. Когда что использовать?
Правило простое:
- Список — когда важен порядок элементов, и вы обращаетесь к ним по индексу. Например, список учеников в классе, результаты измерений, очередь задач.
- Словарь — когда нужно быстро находить значение по уникальному ключу. Например, данные пользователя (имя → возраст), настройки программы, кэш результатов.
Если вы храните список объектов, каждый из которых имеет свойства — часто используют список словарей:
users = [
{"name": "Иван", "age": 25},
{"name": "Мария", "age": 30}
]
4. Частые ошибки новичков
❌ Использование списка там, где нужен словарь
Попытка искать элемент в списке по имени каждый раз — это медленно и громоздко:
# Плохо
users = [["Иван", 25], ["Мария", 30]]
for user in users:
if user[0] == "Иван":
print(user[1])
❌ Ошибка при копировании
Когда пишете new_list = my_list, обе переменные ссылаются на один и тот же список. Изменения отразятся везде. Для копирования используйте my_list.copy() или list(my_list).
a = [1, 2, 3]
b = a
b.append(4)
print(a) # [1, 2, 3, 4] — неожиданно!
❌ Использование несуществующего ключа
Обращение person["job"] вызовет KeyError, если ключа нет. Всегда используйте метод get().
❌ Изменение списка во время его перебора
Это может привести к пропуску элементов или ошибке. Лучше создать новый список или перебирать копию.
# Опасно
for fruit in fruits:
if fruit == "банан":
fruits.remove(fruit)
# Безопасно
for fruit in fruits[:]: # перебираем копию
if fruit == "банан":
fruits.remove(fruit)
5. Живой пример: телефонная книга
Объединим списки и словари в небольшом проекте. Программа хранит контакты и позволяет искать их по имени.
contacts = []
while True:
print("\n1. Добавить контакт")
print("2. Найти контакт")
print("3. Показать все")
print("4. Выход")
choice = input("Выберите действие: ")
if choice == "1":
name = input("Имя: ")
phone = input("Телефон: ")
contacts.append({"name": name, "phone": phone})
print(f"Контакт {name} добавлен.")
elif choice == "2":
search = input("Введите имя для поиска: ")
found = [c for c in contacts if c["name"].lower() == search.lower()]
if found:
for c in found:
print(f"{c['name']} — {c['phone']}")
else:
print("Не найдено.")
elif choice == "3":
for c in contacts:
print(f"{c['name']} — {c['phone']}")
elif choice == "4":
break
else:
print("Неверный выбор.")
В этом коде мы использовали:
- список для хранения всех контактов,
- словарь для каждого контакта,
- цикл while для меню,
- генератор списка для поиска.
Заключение
Списки и словари — это основа основ. Научившись ими пользоваться, вы перестанете писать сотни однотипных переменных и начнёте мыслить структурами. Это делает код короче, чище и гораздо легче для отладки.
Что дальше? В следующей статье мы разберём, как читать и записывать файлы, чтобы ваши программы не забывали данные после закрытия. А пока — возьмите любую задачу из реальной жизни (список дел, телефонная книга, расходы) и попробуйте реализовать её с помощью списков и словарей.
Пишите в комментариях, с какими структурами вы столкнулись в своих проектах. Обсудим!