namedtuple и OrderedDict
Другие полезные коллекции
«namedtuple и OrderedDict» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Ещё две полезные коллекции
Модуль collections содержит namedtuple для создания понятных кортежей, похожих на записи, и OrderedDict для словарей с дополнительными методами управления порядком.
Импортируйте их с помощью from collections import namedtuple, OrderedDict.
from collections import namedtuple, OrderedDict
print(namedtuple)
print(OrderedDict)Определение именованного кортежа
namedtuple(name, fields) создаёт новый подкласс кортежа. Вы передаёте имя типа и список имён полей. Результат представляет собой класс, экземпляры которого можно создавать.
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p)Доступ по имени
Главное преимущество заключается в том, что поля можно читать по имени, а не по трудно запоминаемым индексам, благодаря чему код становится гораздо понятнее.
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p.x)
print(p.y)Это всё ещё кортеж
Именованный кортеж является обычным кортежем, поэтому индексация, распаковка и итерация по-прежнему работают.
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p[0])
x, y = p
print(x + y)Неизменяемый, но заменяемый
Как и все кортежи, именованные кортежи неизменяемы. Чтобы получить изменённую копию, используйте ._replace(): этот метод возвращает новый экземпляр.
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
q = p._replace(y=10)
print(p)
print(q)Преобразование в словарь
._asdict() преобразует именованный кортеж в обычный словарь, сопоставляя имена полей со значениями.
from collections import namedtuple
Car = namedtuple('Car', ['make', 'year'])
c = Car('Toyota', 2026)
print(c._asdict())Значения по умолчанию
Укажите defaults при определении именованного кортежа. Значения по умолчанию применяются к крайним правым полям, поэтому при создании экземпляров их можно не указывать.
from collections import namedtuple
User = namedtuple('User', ['name', 'role'], defaults=['guest'])
print(User('Alice'))
print(User('Bob', 'admin'))Просмотр полей
Атрибут ._fields содержит имена полей. Это полезно для интроспекции или создания универсального кода.
from collections import namedtuple
Color = namedtuple('Color', ['r', 'g', 'b'])
print(Color._fields)Основы OrderedDict
OrderedDict запоминает порядок вставки. Начиная с Python 3.7 обычные словари тоже сохраняют порядок, но OrderedDict добавляет дополнительные методы управления порядком, которых иначе не получить.
from collections import OrderedDict
od = OrderedDict()
od['first'] = 1
od['second'] = 2
print(od)move_to_end
.move_to_end(key) перемещает ключ в конец или в начало с помощью last=False. Это особенность OrderedDict, удобная для логики типа LRU.
from collections import OrderedDict
od = OrderedDict(a=1, b=2, c=3)
od.move_to_end('a')
print(list(od.keys()))
od.move_to_end('c', last=False)
print(list(od.keys()))Равенство с учётом порядка
Два объекта OrderedDict равны только в том случае, если их элементы расположены в одинаковом порядке. Обычные словари не учитывают порядок при сравнении.
from collections import OrderedDict
a = OrderedDict([('x', 1), ('y', 2)])
b = OrderedDict([('y', 2), ('x', 1)])
print(a == b)
print(dict(a) == dict(b))Быстрая проверка
Как создать изменённую копию именованного кортежа, если он неизменяем?
Повторение: именованный кортеж и OrderedDict
Краткое содержание:
namedtuple(name, fields)создаёт понятные неизменяемые записи с доступом по именам.- Используйте
._replace()для создания изменённых копий, а._asdict()— для преобразования в словарь. OrderedDictсохраняет порядок вставки и добавляет.move_to_end().- При сравнении OrderedDict учитывает порядок, в отличие от обычного словаря.
from collections import namedtuple
Pt = namedtuple('Pt', ['x', 'y'])
print(Pt(1, 2)._asdict())Часто задаваемые вопросы
Урок «namedtuple и OrderedDict» бесплатный?
Да — полный текст урока «namedtuple и OrderedDict» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «namedtuple и OrderedDict»?
Другие полезные коллекции Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «namedtuple и OrderedDict»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Counter
- defaultdict
- deque
- namedtuple и OrderedDict