Самое главное помнить: списки (list) – это упорядоченная изменяемая коллекция элементов. Благодаря простому синтаксису и большому набору встроенных методов их удобно использовать для хранения и обработки данных, в т.ч. для сортировки по фамилии.
Содержание
- Что такое список в Python
- Базовые операции со списками
- Сортировка списка по фамилии
- Сортировка без учёта регистра
- Сортировка по нескольким полям
- Удаление дубликатов фамилий
- Практический пример: чтение из CSV‑файла
Что такое список в Python
Список (list) – это упорядоченная изменяемая коллекция элементов любого типа. Элементы могут быть числами, строками, другими списками, объектами и т.д.
Пример создания списка:
names = ["Иванов Иван", "Петров Петр", "Сидоров Сидр"]
Базовые операции со списками
- Обращение по индексу:
names[0] # "Иванов Иван" - Добавление элемента:
names.append("Кузнецов Коля") - Вставка в произвольную позицию:
names.insert(1, "Смирнова Анна") - Удаление элемента:
names.remove("Петров Петр") - Получение длины:
len(names)
Сортировка списка по фамилии
Часто в списке хранится строка вида "Фамилия Имя". Чтобы отсортировать такие записи по фамилии, необходимо указать key‑функцию, которая будет извлекать фамилию.
Пример 1. Список строк
people = [
"Смирнов Алексей",
"Иванов Иван",
"Петров Петр",
"Сидоров Сидр",
"Кузнецов Коля"
]
people.sort(key=lambda s: s.split[0])
print(people)
Пример 2. Список кортежей
Если данные хранятся в виде кортежей (фамилия, имя, возраст), удобно использовать operator.itemgetter.
from operator import itemgetter
employees = [
("Петров", "Петр", 30),
("Иванов", "Иван", 25),
("Смирнова", "Анна", 28),
("Кузнецов", "Коля", 35)
]
employees.sort(key=itemgetter(0))
print(employees)
Сортировка без учёта регистра
Если в данных могут встречаться фамилии с разным регистром (например, "иванов" и "Иванов"), следует привести их к единому регистру внутри key‑функции.
people = ["иванов Иван", "Петров Петр", "Смирнова Анна", "Кузнецов Коля"]
people.sort(key=lambda s: s.split[0].lower)
print(people)
Сортировка по нескольким полям
Иногда требуется сначала сортировать по фамилии, а при одинаковой фамилии – по имени.
people = [
"Иванов Иван",
"Иванов Алексей",
"Петров Петр",
"Петров Анна",
"Смирнова Анна"
]
people.sort(key=lambda s: (s.split[0], s.split[1]))
print(people)
Удаление дубликатов фамилий
Если в списке могут встречаться одинаковые фамилии, их удобно «очистить» с помощью dict.fromkeys (сохраняет порядок) или set (не сохраняет порядок).
people = [
"Иванов Иван",
"Петров Петр",
"Иванов Алексей",
"Смирнова Анна",
"Петров Анна"
]
unique_by_surname = {}
for entry in people:
surname = entry.split[0]
if surname not in unique_by_surname:
unique_by_surname[surname] = entry
result = list(unique_by_surname.values)
print(result)
Практический пример: чтение из CSV‑файла и сортировка по фамилии
Предположим, у вас есть файл employees.csv со следующей структурой:
Фамилия,Имя,Возраст
Иванов,Иван,25
Петров,Петр,30
Смирнова,Анна,28
Кузнецов,Коля,35
Иванов,Алексей,22
Ниже показан скрипт, который читает файл, формирует список кортежей и сортирует его по фамилии, а затем выводит результат в виде таблицы.
import csv
from operator import itemgetter
def read_csv(filepath):
with open(filepath, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
return [(row['Фамилия'], row['Имя'], int(row['Возраст'])) for row in reader]
def sort_by_surname(data):
# Сортируем по фамилии, потом по имени
return sorted(data, key=itemgetter(0, 1))
def print_table(data):
print(f"{'Фамилия':