Занятие № 7. Применение списков для решения задач
Цель: научиться применять одномерные списки для решения задач.
Теория
Создание списка
Список - это набор упорядоченных и пронумерованных элементов. Каждый элемент списка - это значение любого встроенного или определённого программистом типа. В Python списки имеют тип list.
Самый простой способ создать список - заключить его элементы в квадратные скобки и разделить запятой:
В Python элементы списка не обязательно должны быть одного типа:
Чтобы объявить пустой список, квадратные скобки оставляют пустыми:
Хорошей практикой считается не смешивать в списке значения разных типов, несмотря на то, что это не запрещено синтаксисом языка. Проще отладить код со списками, в которых хранятся значения одного типа.
Оператор индексирования списка
Элементы списка пронумерованы и к ним можно обращаться по их индексу. Нумерация элементов списка начинается с нуля.
Получить элемент списка по его индексу можно с помощью оператора [ ].
fib = [1, 1, 2, 3, 5, 8, 13] print(fib[2]) print(fib[9-8]) print(fib[-2])
Когда индекс отрицателен, это значит, что мы отсчитываем номер элемента x справа налево.
Что выведется на экран после выполнения следующей программы:
Верно. Отсчёт элементов начинается с 0. Список [56, 57, "Python"] и [ ] также считаются за один элемент.
Индекс пустого списка равен 4.
Отсчёт индексов начинается с 0. Индекс элемента False - 6.
Строка "Python" находится в списке, который сам по себе будет элементом списка alist. Весь этот вложенный список считается за один элемент списка alist.
Списки относятся к изменяемому типу данных. Мы можем заменить значение, которое находится по заданному индексу:
myList = [0, 1, 4, 6] print(myList[2]) myList[2] = 0 # меняем элемент с индексом 2 на 0 print(myList)
Элементами списка могут быть другие списки. Чтобы получить элемент из вложенного списка операторы индексирования записываются последовательно:
magic_sq = [
[2, 7, 6],
[9, 5, 1],
[4, 3, 8]
]
print(magic_sq[1][2]) # вторая строка, третий столбец
В списке magic_sq хранится
x
?
элемента. Чтобы получить из этого списка элемент первой строки и второго столбца нужно записать
x
magic_sq[0][1].
Количество элементов списка
С помощью функции len() можно узнать количество элементов в списке:
fib = [1, 1, 2, 3, 5, 8, 13] print(len(fib))
Элементами списка могут быть другие структурированные типы, длину которых также можно вычислить. Длина этих элементов не учитывается в расчёте длины списка:
alist = ["Привет", 2.0, 5] print(len(alist)) print(len(alist[0]))
В этом примере функция len(alist) вернёт число
x
?
, а вызов функции len(alist[0]) вернёт число
x , так как мы находим длину элемента под индексом 0.
Что выведется на экран после выполнения следующей программы:
Верно. Список [True, False] считается за один элемент списка alist.
Функция len() возвращает не индекс последнего элемента, а их количество.
Список [True, False] будет считаться за один элемента списка alist.
Код записан корректно.
Оператор получения среза
Чтобы получить часть списка используется оператор среза [:]. Со списками оператор среза работает также, как и для строковых значений:
a_list = ['а', 'б', 'в', 'г', 'д', 'е'] print(a_list[1:3]) print(a_list[:4]) print(a_list[3:]) print(a_list[:])
Запустите код примера, чтобы увидеть результат работы оператора [:]. В этом примере чтобы получить срез из первых двух элементов списка нужно записать
x
a_list[:3].
Что выведется на экран после выполнения следующей программы:
Верно. Мы получает срез элементов начиная с индекса 4 и до последнего индекса списка alist.
В срезе не указан последний индекс после :, значит мы берём все элементы до конца списка alist.
Индекс первого элемента равен 0.
Что выведется на экран после выполнения следующей программы:
Да, в этом срезе три элемента.
Срез начинается со второго элемента списка L и заканчивается предпоследним элементом.
Срез начинается со второго элемента списка L и заканчивается предпоследним элементом.
Срез начинается со второго элемента списка L и заканчивается предпоследним элементом.
Сложение и умножение
Списки можно складывать между собой. Сложим два списка получим новый список, содержащий элементы первого и второго списка:
odd_list = [1, 3, 5] even_list = [2, 4, 6] new_list = odd_list + even_list print(new_list)
Умножая список на целое число получим новый список в котором элементы исходного списка повторяются заданное количество раз:
zeroes = [0] # список из одного элемента равного 0 lst = zeroes * 5 print(lst)
После выполнения этого кода список lst будет содержать
x элементов, равных нулю.
Что выведется на экран после выполнения следующей программы:
Да, новый список содержит элементы списка alist и следующие за ними элементы списка blist.
Сложение списков не равно сумме длин списков.
Сложение списков не меняет порядка элементов в новом списке.
Сложение списков не складывает между собой элементы этих списков.
Да, в новом списки элементы исходного списка повторяются указанное количество раз.
В результате умножения списка на число мы не умножаем длину списка на это число.
Умножение не приведёт к повторению каждого элемента по отдельности.
Умножение списка на число не приводит к умножению каждого элемента списка на это число.
Оператор принадлежности in
С помощью операторов in и not in можно определить есть ли в списке указанный элемент:
lang = ["Python", "JavaScript", "C++"]
print("Python" in lang)
print("Java" not in lang)
Разбиение и слияние строк
Два метода класса str тесно связаны с использованием списков.
С помощью метода split() можно разделить строку и получить список подстрок. Разделитель по умолчанию - пробел. Но в скобках можно указать произвольную строку-разделитель. Сам разделитель из строки удаляется.
verse = "Кто понял жизнь тот больше не спешит" wds = verse.split() print(wds)
После выполнения этого кода в переменной wds окажется список содержащий
x
?
элементов.
Метод split() принимает в качестве аргумента разделитель строки:
verse = "Кто понял жизнь тот больше не спешит"
wds = verse.split("т") # разделитель - буква т
print(wds)
Метод класса join() работает в обратную сторону. С его помощью элементы списка можно соединить в одну строку.
Запустите следующий код, чтобы увидеть работу метода join():
wds = ["Красота", "спасёт", "мир"]
glue = ';'
s = glue.join(wds)
print(s)
print(wds)
print("***".join(wds))
print("".join(wds))
Методы класса list
Класс list содержит ряд методов для изменения списка:
list
| Метод | Назначение |
|---|---|
<список>.append(x) |
Добавление x в конец списка |
<список>.sort() |
Сортировка списка |
<список>.reverse() |
Расположение элементов списка в обратном порядке |
<список>.index(x) |
Получение индекса первого вхождения x |
<список>.insert(i, x) |
Вставка в список элемента x по индексу i |
<список>.count(x) |
Получение количества повторений x в списке |
<список>.remove(x) |
Удаление первого вхождения x в список |
<список>.pop()<список>.pop(i) |
Удаление из списка последнего или i-го элемента и возврат его значения |
Рассмотрим пример применения некоторых методов:
q = [] # создаём пустой список
print(q)
# добавляем к списку два элемента
q.append("курсовая.doc")
q.append("фото.jpg")
print(q)
last = q.pop() # удаляем последний элемент списка
print("Последний элемент:", last)
print(q)
q.insert(0, "!ДИПЛОМ.docx") # вставляем элемент в начало списка
print(q)
Если мы захотим удалить из списка q первый элемент то запишем инструкцию
x
q.pop(0).
Операторы обработки списков собраны в следующей таблице:
| Инструкции и операторы | Значение |
|---|---|
+ |
Объединение списков |
* |
Повторение |
<список>[] |
Индексирование |
<список>[:] |
Срез |
len(<список>) |
Количество элементов |
for <элемент> in <список> |
Перебор элементов списка |
<выражение> in <список> |
Проверка принадлежности (bool) |
В Python есть ещё один последовательный тип данных - кортеж (тип tuple). В отличие от списков, содержимое кортежа нельзя редактировать после создания:
data = (1, 2, 3) # создание кортежа print(data[0]) # обращение к элементу кортежа по индексу data[0] = 0 # возникнет ошибка!
Кортежи в Python имеют несколько применений: одновременное присваивание, возврат нескольких значений из функции, передача аргументов в функции и др.
Подробнее с кортежами можно познакомиться по ссылке.
Разминка
Запишите результат вывода для каждой строки кода.
print(lst[2]) ↪︎︎
x
?
print(lst[1:4]) ↪︎︎
x
[20, 30, 40]
print(len(lst[1:4])) ↪︎︎
x
?
print(30 in lst) ↪︎︎
x
True
print(lst[3]) ↪︎︎
x
?
print(lst[2:5]) ↪︎︎
x
[300, 400, 500]
print(len(lst[2:5])) ↪︎︎
x
?
print(600 in lst) ↪︎︎
x
False
print(lst[0]) ↪︎︎
x
?
print(lst[1:3]) ↪︎︎
x
[10, 15]
print(len(lst[1:3])) ↪︎︎
x
?
print(15 in lst) ↪︎︎
x
True
print(lst[4]) ↪︎︎
x
?
print(lst[0:3]) ↪︎︎
x
[7, 14, 21]
print(len(lst[0:3])) ↪︎︎
x
?
print(42 in lst) ↪︎︎
x
False
print(lst[1]) ↪︎︎
x
?
print(lst[2:4]) ↪︎︎
x
[9, 12]
print(len(lst[2:4])) ↪︎︎
x
?
print(18 in lst) ↪︎︎
x
False
print(lst[3]) ↪︎︎
x
?
print(lst[1:5]) ↪︎︎
x
[16, 24, 32, 40]
print(len(lst[1:5])) ↪︎︎
x
?
print(48 in lst) ↪︎︎
x
False
print(lst[2]) ↪︎︎
x
?
print(lst[0:4]) ↪︎︎
x
[1, 3, 5, 7]
print(len(lst[0:4])) ↪︎︎
x
?
print(11 in lst) ↪︎︎
x
False
print(lst[4]) ↪︎︎
x
?
print(lst[1:3]) ↪︎︎
x
[4, 8]
print(len(lst[1:3])) ↪︎︎
x
?
print(64 in lst) ↪︎︎
x
False
print(lst[5]) ↪︎︎
x
?
print(lst[3:6]) ↪︎︎
x
[40, 50, 60]
print(len(lst[3:6])) ↪︎︎
x
?
print(70 in lst) ↪︎︎
x
False
print(lst[0]) ↪︎︎
x
?
print(lst[2:5]) ↪︎︎
x
[33, 44, 55]
print(len(lst[2:5])) ↪︎︎
x
?
print(66 in lst) ↪︎︎
x
False
print(lst[3]) ↪︎︎
x
?
print(lst[1:4]) ↪︎︎
x
[30, 45, 60]
print(len(lst[1:4])) ↪︎︎
x
?
print(90 in lst) ↪︎︎
x
False
print(lst[2]) ↪︎︎
x
?
print(lst[0:5]) ↪︎︎
x
[25, 50, 75, 100, 125]
print(len(lst[0:5])) ↪︎︎
x
?
print(150 in lst) ↪︎︎
x
False
print(lst[1]) ↪︎︎
x
?
print(lst[2:5]) ↪︎︎
x
[12, 16, 20]
print(len(lst[2:5])) ↪︎︎
x
?
print(24 in lst) ↪︎︎
x
False
print(lst[4]) ↪︎︎
x
?
print(lst[1:4]) ↪︎︎
x
[14, 21, 28]
print(len(lst[1:4])) ↪︎︎
x
?
print(42 in lst) ↪︎︎
x
False
Примеры
Познакомьтесь с готовым решением задачи. Ответьте на вопросы после кода решения задачи.
Пример “Шаблоны кода” (ex01.py)
Программа принимает на вход n вещественных чисел - длин отрезков пути, пройденных марсоходом. Значения вводятся в километрах. Пример входных значений показан на рисунке1:
- Переведите все введённых значения в метры.
- Вычислите суммарный путь \(S\), пройденный марсоходом.
- Найдите длину минимального отрезка пути, пройденного роботом и его индекс.
Заполнение списка
Код для ввода значений и сохранения их в списке выглядит следующим образом:
Запустите программу и протестируйте её работу:
Количество отрезков: <{3}> ++enter++
> <{1.4}> ++enter++
> <{0.44}> ++enter++
> <{0.56}> ++enter++
[1.4, 0.44, 0.56]Цикл for выполнится
x
n раз. На каждой итерации цикла будем добавлять в переменную под именем
x
?
очередное значение, вводимое с клавиатуры.
Преобразование элементов списка
Преобразуем все значения в списке из км в м.
Следующий код и дальнейшие фрагменты решения дописывайте в отрытой программе ex01.py после существующего кода.
Запустите программу и протестируйте её работу:
Количество отрезков: <{3}> ++enter++
> <{1.4}> ++enter++
> <{0.44}> ++enter++
> <{0.56}> ++enter++
[1.4, 0.44, 0.56]
[1400.0, 440.0, 560.0]Переменная цикла под именем
x
?
будет принимать значения от
x
?
до
x
n-1. Это позволит переменной цикла перебрать индексы всех элементов списка lst.
Сумма элементов списка
Вычислим сумму элементов списка.
Запустите программу и протестируйте её работу:
Количество отрезков: <{4}> ++enter++
> <{2.4}> ++enter++
> <{0.25}> ++enter++
> <{1.62}> ++enter++
> <{0.56}> ++enter++
[2.4, 0.25, 1.62, 0.35]
[2400.0, 250.0, 1620.0, 350.0]
S=4620.0 мЗначение суммы будет накапливаться в переменной под именем
x
?
. На каждом шаге цикла очередной элемент списка lst находится в переменной под именем
x
?
.
Поиск минимального элемента
Остаётся найти индекс и значение минимального элемента в списке.
Запустите программу и протестируйте её работу:
Количество отрезков: <{3}> ++enter++
> <{0.5}> ++enter++
> <{0.3}> ++enter++
> <{0.3}> ++enter++
[0.5, 0.3, 0.3]
[500.0, 300.0, 300.0]
S=1100.0 м
1: min=300.0 мЗадания для самостоятельной работы
Решите следующие задачи самостоятельно.
Задание № 1 (sam01.py)
В вашей кофейне работает N бариста. Оплата за час фиксирована - 5 руб. Напишите программу, которая позволит ввести количество часов, отработанных каждым из N сотрудников, посчитать оплату их труда и вычислить общую сумму для выплаты зарплат. Время работы каждого сотрудника должно храниться в списке.
Примеры работы программы:
Количество сотрудников:3
> <{7}> ++enter++
> <{8}> ++enter++
> <{10}> ++enter++
сотрудник 0: 35.0 руб.
сотрудник 1: 40.0 руб.
сотрудник 2: 50.0 руб.
Сумма: 125.0 руб.Задание № 2 (sam02.py)
С клавиатуры вводятся среднемесячные показания температуры за год. Найдите номер месяца с наибольшей среднемесячной температурой и выведите её значение.
Примеры работы программы:
1> <{-7}> ++enter++
2> <{-7}> ++enter++
3> <{4}> ++enter++
4> <{12}> ++enter++
5> <{19}> ++enter++
6> <{21}> ++enter++
7> <{24}> ++enter++
8> <{23}> ++enter++
9> <{17}> ++enter++
10> <{10}> ++enter++
11> <{3}> ++enter++
12> <{-1}> ++enter++
Месяц 7, температура: 24 CЗадание № 3 (sam03.py)
Напишите программу, которая принимает на вход 4 отметки и рассчитывает средний балл без учёта одной минимальной отметки.
Примеры работы программы:
> <{8}> ++enter++
> <{7}> ++enter++
> <{9}> ++enter++
> <{5}> ++enter++
Ответ: 8.0> <{4}> ++enter++
> <{6}> ++enter++
> <{4}> ++enter++
> <{5}> ++enter++
Ответ: 5.0Задание № 4 (sam04.py)
Создайте программу, которая создаёт аббревиатуру по введённым словам. Буквы в аббревиатуре должны быть большими.
Примеры работы программы:
Введите строку: <{запоминающее устройство}> ++enter++
Аббревиатура: ЗУВведите строку: <{Белорусский Государственный Педагогический Университет}> ++enter++
Аббревиатура: БГПУЗадание № 5 (sam05.py)
Правильные ответы на вопросы теста хранятся в списке answ. Пользователь вводит ответы на вопросы. Выведите на экран количество правильных ответов. Начните код решения с предоставленного шаблона.
Шаблон программы:
sam05.py
Примеры работы программы:
Ответ 1> <{b}> ++enter++
Ответ 2> <{d}> ++enter++
Ответ 3> <{d}> ++enter++
Ответ 4> <{c}> ++enter++
Правильных ответов: 2/4Ответ 1> <{a}> ++enter++
Ответ 2> <{b}> ++enter++
Ответ 3> <{d}> ++enter++
Ответ 4> <{c}> ++enter++
Правильных ответов: 4/4Задание № 6 (sam06.py)
Пользователь вводит текст. Программа рассчитывает среднюю длину слов и выводит её на экран.
Примеры работы программы2:
> <{Съешь ещё этих мягких французских булок, да выпей же чаю.}> ++enter++
Количество слов: 10
Средняя длина слова: 4.8


