HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Для сортировки итерируемых объектов в языке программирования Python есть функция sorted(), а для сортировки списка с заменой исходного существует метод list.sort(). Посмотрим, как они работают.</p>
1 <p>Для сортировки итерируемых объектов в языке программирования Python есть функция sorted(), а для сортировки списка с заменой исходного существует метод list.sort(). Посмотрим, как они работают.</p>
2 <h2>Основы сортировки на Python</h2>
2 <h2>Основы сортировки на Python</h2>
3 <p>Выполнить стандартную сортировку по возрастанию чрезвычайно легко - надо просто вызвать функцию sorted(), которая и возвратит нам новый и уже отсортированный список:</p>
3 <p>Выполнить стандартную сортировку по возрастанию чрезвычайно легко - надо просто вызвать функцию sorted(), которая и возвратит нам новый и уже отсортированный список:</p>
4 &gt;&gt;&gt; sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5]<p>Кроме этого, мы можем задействовать метод списков list.sort(), который изменит исходный список и возвратит None во избежание путаницы. Как правило, это не столь удобно, как в случае с применением sorted(), однако если исходный список вам не нужен, то так даже немного эффективнее:</p>
4 &gt;&gt;&gt; sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5]<p>Кроме этого, мы можем задействовать метод списков list.sort(), который изменит исходный список и возвратит None во избежание путаницы. Как правило, это не столь удобно, как в случае с применением sorted(), однако если исходный список вам не нужен, то так даже немного эффективнее:</p>
5 &gt;&gt;&gt; a = [5, 2, 3, 1, 4] &gt;&gt;&gt; a.sort() &gt;&gt;&gt; a [1, 2, 3, 4, 5]<p>Другое отличие - метод list.sort() определён лишь для списков, тогда как sorted() может работать со всеми итерируемыми объектами:</p>
5 &gt;&gt;&gt; a = [5, 2, 3, 1, 4] &gt;&gt;&gt; a.sort() &gt;&gt;&gt; a [1, 2, 3, 4, 5]<p>Другое отличие - метод list.sort() определён лишь для списков, тогда как sorted() может работать со всеми итерируемыми объектами:</p>
6 &gt;&gt;&gt; sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}) [1, 2, 3, 4, 5]<h2>Функции-ключи</h2>
6 &gt;&gt;&gt; sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}) [1, 2, 3, 4, 5]<h2>Функции-ключи</h2>
7 <p>Начиная с Python 2.4 у sorted() и list.sort() появился параметр key, необходимый для указания функции, которая станет вызываться на каждом элементе до сравнения.</p>
7 <p>Начиная с Python 2.4 у sorted() и list.sort() появился параметр key, необходимый для указания функции, которая станет вызываться на каждом элементе до сравнения.</p>
8 <p>К примеру, вот реализация независимого от регистра сравнения строк:</p>
8 <p>К примеру, вот реализация независимого от регистра сравнения строк:</p>
9 &gt;&gt;&gt; sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']<p>Обратите внимание, что значение параметра key должно быть функцией, которая принимает один аргумент и возвращает для сортировки ключ. Это работает быстро, так как функция-ключ вызывается для каждого элемента лишь один раз.</p>
9 &gt;&gt;&gt; sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']<p>Обратите внимание, что значение параметра key должно быть функцией, которая принимает один аргумент и возвращает для сортировки ключ. Это работает быстро, так как функция-ключ вызывается для каждого элемента лишь один раз.</p>
10 <p>Также нередко встречается код, в котором сложный объект сортируется по одному из индексов:</p>
10 <p>Также нередко встречается код, в котором сложный объект сортируется по одному из индексов:</p>
11 &gt;&gt;&gt; student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ] &gt;&gt;&gt; sorted(student_tuples, key=lambda student: student[2]) # сортировка по возрасту [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]<p>Этот же метод работает и для объектов с именованными атрибутами:</p>
11 &gt;&gt;&gt; student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ] &gt;&gt;&gt; sorted(student_tuples, key=lambda student: student[2]) # сортировка по возрасту [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]<p>Этот же метод работает и для объектов с именованными атрибутами:</p>
12 &gt;&gt;&gt; class Student: def __init__(self, name, grade, age): self.name = name self.grade = grade self.age = age def __repr__(self): return repr((self.name, self.grade, self.age)) def weighted_grade(self): return 'CBA'.index(self.grade) / self.age &gt;&gt;&gt; student_objects = [ Student('john', 'A', 15), Student('jane', 'B', 12), Student('dave', 'B', 10), ] &gt;&gt;&gt; sorted(student_objects, key=lambda student: student.age) # сортировка по возрасту [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]<h2>Функции модуля operator</h2>
12 &gt;&gt;&gt; class Student: def __init__(self, name, grade, age): self.name = name self.grade = grade self.age = age def __repr__(self): return repr((self.name, self.grade, self.age)) def weighted_grade(self): return 'CBA'.index(self.grade) / self.age &gt;&gt;&gt; student_objects = [ Student('john', 'A', 15), Student('jane', 'B', 12), Student('dave', 'B', 10), ] &gt;&gt;&gt; sorted(student_objects, key=lambda student: student.age) # сортировка по возрасту [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]<h2>Функции модуля operator</h2>
13 <p>Вышепоказанные примеры функций-ключей мы встречаем очень часто. Именно поэтому Python предлагает нам удобные функции, позволяющие всё сделать и быстрее, и проще. Для этого существует модуль<a>operator</a>- он содержит функцию itemgetter(), функцию attrgetter(), а, начиная с Python версии 2.6, ещё и функцию methodcaller().</p>
13 <p>Вышепоказанные примеры функций-ключей мы встречаем очень часто. Именно поэтому Python предлагает нам удобные функции, позволяющие всё сделать и быстрее, и проще. Для этого существует модуль<a>operator</a>- он содержит функцию itemgetter(), функцию attrgetter(), а, начиная с Python версии 2.6, ещё и функцию methodcaller().</p>
14 <p>Если мы станем применять эти функции, примеры станут ещё проще:</p>
14 <p>Если мы станем применять эти функции, примеры станут ещё проще:</p>
15 &gt;&gt;&gt; from operator import itemgetter, attrgetter, methodcaller &gt;&gt;&gt; sorted(student_tuples, key=itemgetter(2)) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] &gt;&gt;&gt; sorted(student_objects, key=attrgetter('age')) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]<p>Кроме того, функции модуля operator предоставляют нам возможность применять множественные уровни сортировки. К примеру, ниже мы сортируем сначала по оценке, а потом и по возрасту:</p>
15 &gt;&gt;&gt; from operator import itemgetter, attrgetter, methodcaller &gt;&gt;&gt; sorted(student_tuples, key=itemgetter(2)) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] &gt;&gt;&gt; sorted(student_objects, key=attrgetter('age')) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]<p>Кроме того, функции модуля operator предоставляют нам возможность применять множественные уровни сортировки. К примеру, ниже мы сортируем сначала по оценке, а потом и по возрасту:</p>
16 &gt;&gt;&gt; sorted(student_tuples, key=itemgetter(1, 2)) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] &gt;&gt;&gt; sorted(student_objects, key=attrgetter('grade', 'age')) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]<p>В очередном примере мы применяем функцию methodcaller() в целях сортировки учащихся по взвешенной оценке:</p>
16 &gt;&gt;&gt; sorted(student_tuples, key=itemgetter(1, 2)) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] &gt;&gt;&gt; sorted(student_objects, key=attrgetter('grade', 'age')) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]<p>В очередном примере мы применяем функцию methodcaller() в целях сортировки учащихся по взвешенной оценке:</p>
17 &gt;&gt;&gt; [(student.name, student.weighted_grade()) for student in student_objects] [('john', 0.13333333333333333), ('jane', 0.08333333333333333), ('dave', 0.1)] &gt;&gt;&gt; sorted(student_objects, key=methodcaller('weighted_grade')) [('jane', 'B', 12), ('dave', 'B', 10), ('john', 'A', 15)]<p>По материалам статьи "<a>Sorting Mini-HOW TO</a>".</p>
17 &gt;&gt;&gt; [(student.name, student.weighted_grade()) for student in student_objects] [('john', 0.13333333333333333), ('jane', 0.08333333333333333), ('dave', 0.1)] &gt;&gt;&gt; sorted(student_objects, key=methodcaller('weighted_grade')) [('jane', 'B', 12), ('dave', 'B', 10), ('john', 'A', 15)]<p>По материалам статьи "<a>Sorting Mini-HOW TO</a>".</p>
18  
18