HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Популярность<strong>Python</strong>обуславливается его относительной простотой и широкими функциональными возможностями. Среди них - успешная работа со структурами данных - это<strong>списки</strong>, кортежи, словари и множества. В нашей сегодняшней статье мы разберёмся со списками, поговорим про добавление и поиск элементов, а напоследок подробно расскажем об<strong>особенностях сортировки в Python</strong>.</p>
1 <p>Популярность<strong>Python</strong>обуславливается его относительной простотой и широкими функциональными возможностями. Среди них - успешная работа со структурами данных - это<strong>списки</strong>, кортежи, словари и множества. В нашей сегодняшней статье мы разберёмся со списками, поговорим про добавление и поиск элементов, а напоследок подробно расскажем об<strong>особенностях сортировки в Python</strong>.</p>
2 <h2>Что такое список в Python?</h2>
2 <h2>Что такое список в Python?</h2>
3 <p><strong>Список (list)</strong>представляет собой структуру данных, предназначенную для хранения объектов. При этом не стоит путать список с массивом.</p>
3 <p><strong>Список (list)</strong>представляет собой структуру данных, предназначенную для хранения объектов. При этом не стоит путать список с массивом.</p>
4 <p>Некоторые<strong>особенности списка</strong>в Python: - в списке можно хранить элементы разных типов; - размер списка можно изменять.</p>
4 <p>Некоторые<strong>особенности списка</strong>в Python: - в списке можно хранить элементы разных типов; - размер списка можно изменять.</p>
5 <h2>Как хранятся списки в памяти?</h2>
5 <h2>Как хранятся списки в памяти?</h2>
6 <p>Во время создания списка в<strong>Python</strong>происходит резервирование пустой области в памяти. Условно можно сказать, что это некий контейнер, где содержатся ссылки на другие элементы данных. Однако в отличие от таких данных, как строка либо число, содержимое контейнера списка может меняться.</p>
6 <p>Во время создания списка в<strong>Python</strong>происходит резервирование пустой области в памяти. Условно можно сказать, что это некий контейнер, где содержатся ссылки на другие элементы данных. Однако в отличие от таких данных, как строка либо число, содержимое контейнера списка может меняться.</p>
7 <p>Чтобы лучше представлять вышеописанный процесс, посмотрим на картинку. Мы увидим список, который содержит ссылки на объекты 1 и 2. При этом после выполнения операции a[1] = 3, вторая ссылка станет указывать на объект № 3 (в<strong>Питоне</strong>элементы списка нумеруются, начиная с нуля).</p>
7 <p>Чтобы лучше представлять вышеописанный процесс, посмотрим на картинку. Мы увидим список, который содержит ссылки на объекты 1 и 2. При этом после выполнения операции a[1] = 3, вторая ссылка станет указывать на объект № 3 (в<strong>Питоне</strong>элементы списка нумеруются, начиная с нуля).</p>
8 <h4>Создание, удаление и изменение списков, а также работа с его элементами</h4>
8 <h4>Создание, удаление и изменение списков, а также работа с его элементами</h4>
9 <p>Создать список в Python можно следующим способом:</p>
9 <p>Создать список в Python можно следующим способом:</p>
10 &gt;&gt;&gt; a = [] &gt;&gt;&gt; type(a) &lt;class 'list'&gt; &gt;&gt;&gt; b = list() &gt;&gt;&gt; type(b) &lt;class 'list'&gt;<p>Кроме того, возможно<strong>создание списка</strong>с заранее известным набором данных:</p>
10 &gt;&gt;&gt; a = [] &gt;&gt;&gt; type(a) &lt;class 'list'&gt; &gt;&gt;&gt; b = list() &gt;&gt;&gt; type(b) &lt;class 'list'&gt;<p>Кроме того, возможно<strong>создание списка</strong>с заранее известным набором данных:</p>
11 &gt;&gt;&gt; a = [1, 2, 3] &gt;&gt;&gt; type(a) &lt;class 'list'&gt;<p>Если список уже есть и нужно создать копию, это тоже не проблема:</p>
11 &gt;&gt;&gt; a = [1, 2, 3] &gt;&gt;&gt; type(a) &lt;class 'list'&gt;<p>Если список уже есть и нужно создать копию, это тоже не проблема:</p>
12 &gt;&gt;&gt; a = [1, 3, 5, 7] &gt;&gt;&gt; b = list(a) &gt;&gt;&gt; print(a) [1, 3, 5, 7] &gt;&gt;&gt; print(b) [1, 3, 5, 7]<p>Обратите внимание, что если вы делаете простое присваивание списков друг другу, то переменной (в нашем примере это b) присваивается ссылка на тот же самый элемент данных в памяти, как и в списке a (не на копию списка a). Таким образом, если захотите изменить список a, b тоже будет меняться.</p>
12 &gt;&gt;&gt; a = [1, 3, 5, 7] &gt;&gt;&gt; b = list(a) &gt;&gt;&gt; print(a) [1, 3, 5, 7] &gt;&gt;&gt; print(b) [1, 3, 5, 7]<p>Обратите внимание, что если вы делаете простое присваивание списков друг другу, то переменной (в нашем примере это b) присваивается ссылка на тот же самый элемент данных в памяти, как и в списке a (не на копию списка a). Таким образом, если захотите изменить список a, b тоже будет меняться.</p>
13 &gt;&gt;&gt; a = [1, 3, 5, 7] &gt;&gt;&gt; b = a &gt;&gt;&gt; print(a) [1, 3, 5, 7] &gt;&gt;&gt; print(b) [1, 3, 5, 7] &gt;&gt;&gt; a[1] = 10 &gt;&gt;&gt; print(a) [1, 10, 5, 7] &gt;&gt;&gt; print(b) [1, 10, 5, 7]<p>Если нужно добавить элемент в список, используем метод append():</p>
13 &gt;&gt;&gt; a = [1, 3, 5, 7] &gt;&gt;&gt; b = a &gt;&gt;&gt; print(a) [1, 3, 5, 7] &gt;&gt;&gt; print(b) [1, 3, 5, 7] &gt;&gt;&gt; a[1] = 10 &gt;&gt;&gt; print(a) [1, 10, 5, 7] &gt;&gt;&gt; print(b) [1, 10, 5, 7]<p>Если нужно добавить элемент в список, используем метод append():</p>
14 &gt;&gt;&gt; a = [] &gt;&gt;&gt; a.append(3) &gt;&gt;&gt; a.append("hello") &gt;&gt;&gt; print(a) [3, 'hello']<p>А если требуется удалить элемент из списка в том случае, когда его значение известно, рекомендуется применение метода remove(x), который удалит первую ссылку на этот элемент:</p>
14 &gt;&gt;&gt; a = [] &gt;&gt;&gt; a.append(3) &gt;&gt;&gt; a.append("hello") &gt;&gt;&gt; print(a) [3, 'hello']<p>А если требуется удалить элемент из списка в том случае, когда его значение известно, рекомендуется применение метода remove(x), который удалит первую ссылку на этот элемент:</p>
15 &gt;&gt;&gt; b = [2, 3, 5] &gt;&gt;&gt; print(b) [2, 3, 5] &gt;&gt;&gt; b.remove(3) &gt;&gt;&gt; print(b) [2, 5]<p>Для удаления элемента по индексу подходит команда del имя_списка[индекс]:</p>
15 &gt;&gt;&gt; b = [2, 3, 5] &gt;&gt;&gt; print(b) [2, 3, 5] &gt;&gt;&gt; b.remove(3) &gt;&gt;&gt; print(b) [2, 5]<p>Для удаления элемента по индексу подходит команда del имя_списка[индекс]:</p>
16 &gt;&gt;&gt; c = [3, 5, 1, 9, 6] &gt;&gt;&gt; print(c) [3, 5, 1, 9, 6] &gt;&gt;&gt; del c[2] &gt;&gt;&gt; print(c) [3, 5, 9, 6]<p>Кроме того, можно изменить элемент списка в<strong>Python</strong>(его значение), напрямую к нему обратившись. Но для этого надо знать индекс элемента:</p>
16 &gt;&gt;&gt; c = [3, 5, 1, 9, 6] &gt;&gt;&gt; print(c) [3, 5, 1, 9, 6] &gt;&gt;&gt; del c[2] &gt;&gt;&gt; print(c) [3, 5, 9, 6]<p>Кроме того, можно изменить элемент списка в<strong>Python</strong>(его значение), напрямую к нему обратившись. Но для этого надо знать индекс элемента:</p>
17 &gt;&gt;&gt; d = [2, 4, 9] &gt;&gt;&gt; print(d) [2, 4, 9] &gt;&gt;&gt; d[1] = 17 &gt;&gt;&gt; print(d) [2, 17, 9]<p>А что нужно сделать, если требуется<strong>очистить список в Python</strong>? Для этого можно заново его проинициализировать, как будто вновь его создаёте. А чтобы получить доступ к элементу списка, поместите индекс данного элемента в квадратные скобки:</p>
17 &gt;&gt;&gt; d = [2, 4, 9] &gt;&gt;&gt; print(d) [2, 4, 9] &gt;&gt;&gt; d[1] = 17 &gt;&gt;&gt; print(d) [2, 17, 9]<p>А что нужно сделать, если требуется<strong>очистить список в Python</strong>? Для этого можно заново его проинициализировать, как будто вновь его создаёте. А чтобы получить доступ к элементу списка, поместите индекс данного элемента в квадратные скобки:</p>
18 &gt;&gt;&gt; a = [3, 5, 7, 10, 3, 2, 6, 0] &gt;&gt;&gt; a[2] 7<p>Можно применять и отрицательные индексы (счёт пойдёт с конца). Например, чтобы получить доступ к последнему элементу списка в<strong>Python</strong>, используют следующую команду:</p>
18 &gt;&gt;&gt; a = [3, 5, 7, 10, 3, 2, 6, 0] &gt;&gt;&gt; a[2] 7<p>Можно применять и отрицательные индексы (счёт пойдёт с конца). Например, чтобы получить доступ к последнему элементу списка в<strong>Python</strong>, используют следующую команду:</p>
19 <p>Также может понадобиться найти и получить из списка некоторый подсписок в заданном диапазоне индексов. Чтобы это реализовать, поместите начальный и конечный индексы в квадратные скобки и разделите их двоеточием:</p>
19 <p>Также может понадобиться найти и получить из списка некоторый подсписок в заданном диапазоне индексов. Чтобы это реализовать, поместите начальный и конечный индексы в квадратные скобки и разделите их двоеточием:</p>
20 <p><strong>Объединить списки</strong>в Python тоже несложно. Объединение легко сделать с помощью метода extend:</p>
20 <p><strong>Объединить списки</strong>в Python тоже несложно. Объединение легко сделать с помощью метода extend:</p>
21 combo_list = [1] one_list = [4, 5] a = combo_list.extend(one_list) print(a) # [1, 4, 5]<p>Также в Python можно объединить список с другим, просто добавив их вместе. Это довольно простой способ объединения:</p>
21 combo_list = [1] one_list = [4, 5] a = combo_list.extend(one_list) print(a) # [1, 4, 5]<p>Также в Python можно объединить список с другим, просто добавив их вместе. Это довольно простой способ объединения:</p>
22 my_list = [1, 2, 3] my_list2 = ["a", "b", "c"] combo_list = my_list + my_list2 print(combo_list) # [1, 2, 3, 'a', 'b', 'c']<p>Как видите,<strong>объединить списки</strong>достаточно легко.</p>
22 my_list = [1, 2, 3] my_list2 = ["a", "b", "c"] combo_list = my_list + my_list2 print(combo_list) # [1, 2, 3, 'a', 'b', 'c']<p>Как видите,<strong>объединить списки</strong>достаточно легко.</p>
23 <h2>Закрепляем методы списков в Python</h2>
23 <h2>Закрепляем методы списков в Python</h2>
24 <p>Знание соответствующих методов и функций в<strong>Python</strong>позволит выполнить поиск, добавить нужный элемент, сделать сортировку и т. д. Итак, давайте перечислим основные методы списков и их функции (вспомним те, что уже упоминали, плюс добавим новые): 1.list.append(x) - обеспечивает добавление элемента в конец списка:</p>
24 <p>Знание соответствующих методов и функций в<strong>Python</strong>позволит выполнить поиск, добавить нужный элемент, сделать сортировку и т. д. Итак, давайте перечислим основные методы списков и их функции (вспомним те, что уже упоминали, плюс добавим новые): 1.list.append(x) - обеспечивает добавление элемента в конец списка:</p>
25 &gt;&gt;&gt; a = [1, 2] &gt;&gt;&gt; a.append(3) &gt;&gt;&gt; print(a) [1, 2, 3]<p>2.list.extend(L) - расширяет имеющийся список путем добавления элементов из списка L.</p>
25 &gt;&gt;&gt; a = [1, 2] &gt;&gt;&gt; a.append(3) &gt;&gt;&gt; print(a) [1, 2, 3]<p>2.list.extend(L) - расширяет имеющийся список путем добавления элементов из списка L.</p>
26 &gt;&gt;&gt; a = [1, 2] &gt;&gt;&gt; b = [3, 4] &gt;&gt;&gt; a.extend(b) &gt;&gt;&gt; print(a) [1, 2, 3, 4]<p>3.list.insert(i, x) - добавляет, а точнее, вставляет элемент х в позицию i. В качестве первого аргумента выступает индекс элемента, после которого вставляется элемент х.</p>
26 &gt;&gt;&gt; a = [1, 2] &gt;&gt;&gt; b = [3, 4] &gt;&gt;&gt; a.extend(b) &gt;&gt;&gt; print(a) [1, 2, 3, 4]<p>3.list.insert(i, x) - добавляет, а точнее, вставляет элемент х в позицию i. В качестве первого аргумента выступает индекс элемента, после которого вставляется элемент х.</p>
27 &gt;&gt;&gt; a = [1, 2] &gt;&gt;&gt; a.insert(0, 5) &gt;&gt;&gt; print(a) [5, 1, 2] &gt;&gt;&gt; a.insert(len(a), 9) &gt;&gt;&gt; print(a) [5, 1, 2, 9]<p>4.list.remove(x) - служит для удаления первого вхождения элемента х, включённого в наш список.</p>
27 &gt;&gt;&gt; a = [1, 2] &gt;&gt;&gt; a.insert(0, 5) &gt;&gt;&gt; print(a) [5, 1, 2] &gt;&gt;&gt; a.insert(len(a), 9) &gt;&gt;&gt; print(a) [5, 1, 2, 9]<p>4.list.remove(x) - служит для удаления первого вхождения элемента х, включённого в наш список.</p>
28 &gt;&gt;&gt; a = [1, 2, 3] &gt;&gt;&gt; a.remove(1) &gt;&gt;&gt; print(a) [2, 3]<p>5.list.pop([i]) - обеспечивает удаление элемента из позиции i. Если применять метод без аргумента, удаляется последний элемент, находящийся в списке.</p>
28 &gt;&gt;&gt; a = [1, 2, 3] &gt;&gt;&gt; a.remove(1) &gt;&gt;&gt; print(a) [2, 3]<p>5.list.pop([i]) - обеспечивает удаление элемента из позиции i. Если применять метод без аргумента, удаляется последний элемент, находящийся в списке.</p>
29 &gt;&gt;&gt; a = [1, 2, 3, 4, 5] &gt;&gt;&gt; print(a.pop(2)) 3 &gt;&gt;&gt; print(a.pop()) 5 &gt;&gt;&gt; print(a) [1, 2, 4]<p>6.list.clear() - просто удаляет все элементы:</p>
29 &gt;&gt;&gt; a = [1, 2, 3, 4, 5] &gt;&gt;&gt; print(a.pop(2)) 3 &gt;&gt;&gt; print(a.pop()) 5 &gt;&gt;&gt; print(a) [1, 2, 4]<p>6.list.clear() - просто удаляет все элементы:</p>
30 &gt;&gt;&gt; a = [1, 2, 3, 4, 5] &gt;&gt;&gt; print(a) [1, 2, 3, 4, 5] &gt;&gt;&gt; a.clear() &gt;&gt;&gt; print(a) []<p>7.list.index(x[, start[, end]]) - позволяет вернуть индекс элемента:</p>
30 &gt;&gt;&gt; a = [1, 2, 3, 4, 5] &gt;&gt;&gt; print(a) [1, 2, 3, 4, 5] &gt;&gt;&gt; a.clear() &gt;&gt;&gt; print(a) []<p>7.list.index(x[, start[, end]]) - позволяет вернуть индекс элемента:</p>
31 &gt;&gt;&gt; a = [1, 2, 3, 4, 5] &gt;&gt;&gt; a.index(4) 3<p>8.list.count(x) - возвращает число вхождений элемента х:</p>
31 &gt;&gt;&gt; a = [1, 2, 3, 4, 5] &gt;&gt;&gt; a.index(4) 3<p>8.list.count(x) - возвращает число вхождений элемента х:</p>
32 &gt;&gt;&gt; a=[1, 2, 2, 3, 3] &gt;&gt;&gt; print(a.count(2)) 2<p>9.list.sort(key=None, reverse=False) - сортирует элементы списков по возрастанию. Чтобы выполнить сортировку в обратном порядке используют флаг reverse=True. Кроме того, дополнительные возможности открываются параметром key.</p>
32 &gt;&gt;&gt; a=[1, 2, 2, 3, 3] &gt;&gt;&gt; print(a.count(2)) 2<p>9.list.sort(key=None, reverse=False) - сортирует элементы списков по возрастанию. Чтобы выполнить сортировку в обратном порядке используют флаг reverse=True. Кроме того, дополнительные возможности открываются параметром key.</p>
33 &gt;&gt;&gt; a = [1, 4, 2, 8, 1] &gt;&gt;&gt; a.sort() &gt;&gt;&gt; print(a) [1, 1, 2, 4, 8]<p>10.list.reverse() - порядок расположения элементов меняется на обратный:</p>
33 &gt;&gt;&gt; a = [1, 4, 2, 8, 1] &gt;&gt;&gt; a.sort() &gt;&gt;&gt; print(a) [1, 1, 2, 4, 8]<p>10.list.reverse() - порядок расположения элементов меняется на обратный:</p>
34 &gt;&gt;&gt; a = [1, 3, 5, 7] &gt;&gt;&gt; a.reverse() &gt;&gt;&gt; print(a) [7, 5, 3, 1]<p>11.list.copy() - копирует списки:</p>
34 &gt;&gt;&gt; a = [1, 3, 5, 7] &gt;&gt;&gt; a.reverse() &gt;&gt;&gt; print(a) [7, 5, 3, 1]<p>11.list.copy() - копирует списки:</p>
35 &gt;&gt;&gt; a = [1, 7, 9] &gt;&gt;&gt; b = a.copy() &gt;&gt;&gt; print(a) [1, 7, 9] &gt;&gt;&gt; print(b) [1, 7, 9] &gt;&gt;&gt; b[0] = 8 &gt;&gt;&gt; print(a) [1, 7, 9] &gt;&gt;&gt; print(b) [8, 7, 9]<h2>Сортировка с помощью функции sorted()</h2>
35 &gt;&gt;&gt; a = [1, 7, 9] &gt;&gt;&gt; b = a.copy() &gt;&gt;&gt; print(a) [1, 7, 9] &gt;&gt;&gt; print(b) [1, 7, 9] &gt;&gt;&gt; b[0] = 8 &gt;&gt;&gt; print(a) [1, 7, 9] &gt;&gt;&gt; print(b) [8, 7, 9]<h2>Сортировка с помощью функции sorted()</h2>
36 <p>Давайте ещё раз вернёмся к вопросу<strong>сортировки в Python</strong>. Чтобы отсортировать данные и найти нужные значения, используют простую встроенную функцию sorted(), принимающую итерируемый тип и возвращающую отсортированный список.</p>
36 <p>Давайте ещё раз вернёмся к вопросу<strong>сортировки в Python</strong>. Чтобы отсортировать данные и найти нужные значения, используют простую встроенную функцию sorted(), принимающую итерируемый тип и возвращающую отсортированный список.</p>
37 <p>Стандартная сортировка:</p>
37 <p>Стандартная сортировка:</p>
38 a = [3, 2, 5 ,4, 7, 1] a = sorted(a) print(a) # [1, 2, 3, 4, 5, 7]<p>Сортировка кортежа:</p>
38 a = [3, 2, 5 ,4, 7, 1] a = sorted(a) print(a) # [1, 2, 3, 4, 5, 7]<p>Сортировка кортежа:</p>
39 t = ('Zane', 'Bob', 'Janet') t = sorted(t) print(t) # ['Bob', 'Janet', 'Zane']<p>Сортировка словаря:</p>
39 t = ('Zane', 'Bob', 'Janet') t = sorted(t) print(t) # ['Bob', 'Janet', 'Zane']<p>Сортировка словаря:</p>
40 d = {1:'a', 2:'b', 3:'c'} d = sorted(d) print(d) # [1, 2, 3]<p>Помните, что функция sorted() возвратит список каждый раз вне зависимости от того, какой тип будет передан.</p>
40 d = {1:'a', 2:'b', 3:'c'} d = sorted(d) print(d) # [1, 2, 3]<p>Помните, что функция sorted() возвратит список каждый раз вне зависимости от того, какой тип будет передан.</p>
41 <p>Идём дальше. Мы уже упоминали ранее метод list.sort(). Так вот, он определён только для списков, зато функция sorted() позволит отсортировать любые итерируемые объекты:</p>
41 <p>Идём дальше. Мы уже упоминали ранее метод list.sort(). Так вот, он определён только для списков, зато функция sorted() позволит отсортировать любые итерируемые объекты:</p>
42 &gt;&gt;&gt; sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}) [1, 2, 3, 4, 5]<h2>Сортировка по убыванию и возрастанию в Python</h2>
42 &gt;&gt;&gt; sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}) [1, 2, 3, 4, 5]<h2>Сортировка по убыванию и возрастанию в Python</h2>
43 <p>Ранее упомянутый параметр reverse есть не только у метода list.sort(), но и у функции sorted(). Он принимает boolean-значение и нужен для сортировки по убыванию либо возрастанию. Ниже мы сортируем учеников по убыванию их возраста:</p>
43 <p>Ранее упомянутый параметр reverse есть не только у метода list.sort(), но и у функции sorted(). Он принимает boolean-значение и нужен для сортировки по убыванию либо возрастанию. Ниже мы сортируем учеников по убыванию их возраста:</p>
44 &gt;&gt;&gt; sorted(student_tuples, key=itemgetter(2), reverse=True) [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] &gt;&gt;&gt; sorted(student_objects, key=attrgetter('age'), reverse=True) [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]<h2>Стабильность сортировки, сложная сортировка</h2>
44 &gt;&gt;&gt; sorted(student_tuples, key=itemgetter(2), reverse=True) [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] &gt;&gt;&gt; sorted(student_objects, key=attrgetter('age'), reverse=True) [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]<h2>Стабильность сортировки, сложная сортировка</h2>
45 <p>Начиная с Python версии 2.2, сортировки гарантированно стабильны. Речь о том, что если у записей одинаковые ключи, их порядок не меняется.</p>
45 <p>Начиная с Python версии 2.2, сортировки гарантированно стабильны. Речь о том, что если у записей одинаковые ключи, их порядок не меняется.</p>
46 &gt;&gt;&gt; data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] &gt;&gt;&gt; sorted(data, key=itemgetter(0)) [('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]<p>Здесь 2 записи с 'blue' сохранили изначальный порядок. Данное свойство позволяет сортировать сложные данные путём постепенных сортировок. Например, надо найти и отсортировать данные учеников как по возрасту в возрастающем порядке, так и по оценкам в порядке убывания. Сортировка буде выглядеть так:</p>
46 &gt;&gt;&gt; data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] &gt;&gt;&gt; sorted(data, key=itemgetter(0)) [('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]<p>Здесь 2 записи с 'blue' сохранили изначальный порядок. Данное свойство позволяет сортировать сложные данные путём постепенных сортировок. Например, надо найти и отсортировать данные учеников как по возрасту в возрастающем порядке, так и по оценкам в порядке убывания. Сортировка буде выглядеть так:</p>
47 &gt;&gt;&gt; s = sorted(student_objects, key=attrgetter('age')) # по вторичному ключу &gt;&gt;&gt; sorted(s, key=attrgetter('grade'), reverse=True) # по первичному [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]<p><em>Остались вопросы? Хотите поделиться своим личным опытом работы со списками? Нашли ошибку в тексте? Пишите комментарий!</em></p>
47 &gt;&gt;&gt; s = sorted(student_objects, key=attrgetter('age')) # по вторичному ключу &gt;&gt;&gt; sorted(s, key=attrgetter('grade'), reverse=True) # по первичному [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]<p><em>Остались вопросы? Хотите поделиться своим личным опытом работы со списками? Нашли ошибку в тексте? Пишите комментарий!</em></p>
48  
48