Занятие № 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 <список> |
Проверка принадлежности (Boolean) |
В Python есть ещё один последовательный тип данных - кортеж (тип tuple). В отличие от списков, содержимое кортежа нельзя редактировать после создания:
data = (1, 2, 3) # создание кортежа print(data[0]) # обращение к элементу кортежа по индексу data[0] = 0 # возникнет ошибка!
Кортежи в Python имеют несколько применений: одновременное присваивание, возврат нескольких значений из функции, передача аргументов в функции и др.
Подробнее с кортежами можно познакомиться по ссылке.
Примеры
Пример № 1 (ex01.py)
Дано 5 целых чисел вводимых с клавиатуры. Напишите программу, которая определяет наименьшее из введённых чисел и выводит его на экран.
data = []
print("Введите 5 чисел")
for i in range(5):
n = int(input('> '))
data.append(n) # добавляем число к списку
print("Список значений: ", data)
min = data[0]
for x in data:
if x < min:
min = x
print("Минимальное значение: ", min)
Список оценок будет храниться в переменной с именем
x
. С помощью цикла попросим пользователя пять раз ввести с клавиатуры оценку и сохраним её в переменную n. Затем с помощью метода списка append() добавим оценку в конец списка.
В девятой строке программы переменной min присвоим
x
первый элемент списка data. Цикл for в десятой строке позволит перебрать все элементы списка и сравнить каждый элемент со значением в переменной min.
Пример № 2 (ex02.py)
Дан список из 10 случайных целых чисел в отрезке 0, 20. Отсортируйте список по возрастанию и убыванию и выведите результаты на экран. Для решения используйте стандартные методы для списков.
import random
data = []
for i in range(10):
n = random.randint(0, 20)
data.append(n) # добавляем число к списку
data.sort() # сортируем список
print(data)
data.reverse() # инвертируем порядок элементов
print(data)
Пример № 3 (ex03.py)
Пользователь вводит строку, которая содержит ASCII-коды, разделённые пробелом. Программа выводит на экран расшифрованное сообщение.
inString = input("Введите сообщение: ")
message = [] # создаём пустой список
codes = inString.split(" ") # получаем список "чисел"
# перебираем все "числа" из кода
for numStr in codes:
# преобразуем строку в число
codeNum = int(numStr)
# добавляем раскодированный символ к итоговому сообщению
message.append(chr(codeNum))
# получаем из списка букв одну строку
messageStr = "".join(message)
print(f"Текст сообщения: {messageStr}")
Раскодируйте сообщение, скрытое в этом коде:
90 110 97 110 105 101 32 45 32 115 105 108 97 33
Задания для самостоятельной работы
Задание № 1 (sam01.py)
Пользователь вводит целое число n - количество элементов в списке. Затем программа просит пользователя ввести n чисел и сохраняет их в списке. Вывести на экран только чётные числа, хранящиеся в списке.
Пример:
Введите количество чисел (n): 4
Введите число: 2
Введите число: 1
Введите число: 7
Введите число: 8
Чётные числа:
2
8
%. Если остаток деления на 2 равен нулю, значит число чётное.
for. Один для ввода чисел, второй - для поиска и вывода чётных чисел.
# ввод количества чисел n
n = int(input("Введите количество чисел (n): "))
# создаём пустой список lst
lst = []
# запускаем цикл for, который выполнится n раз
for i in range(n):
num = int(input("Введите число: "))
# добавляем введёное число в список lst
lst.append(num)
print(lst)
print("Чётные числа:")
for i in lst:
if i % 2 == 0:
print(i)Задание № 2 (sam02.py)
Пользователь вводит целое число n - количество элементов в списке. Программа создаёт список из n случайных чисел из диапазона от -10 до 10 и выводит их на экран. После этого выведите на экран элементы списка стоящие на позициях с чётными номерами.
Дополнительный плюс, если не будет использован оператор if.
Пример:
Введите количество чисел (n): 4
Содержимое списка: [-6, -2, 5, -8]
Числа с чётными номерами:
-6
5
Задание № 3 (sam03.py)
Два друга попросили помочь вам с покупками. Каждый из них прислал вам свой список продуктов (3 продукта). Разработайте программу которая позволит ввести в две отдельные переменные списки продуктов, соединит эти списки и отсортирует общий список по алфавиту. Отсортированный список должен быть выведен на экран следующим образом:
- каждый элемент с новой строки;
- каждый элемент пронумерован по-порядку.
Пример:
Введите продукты из первого списка (3 шт.)
молоко
хлеб
шоколадка
Введите продукты из второго списка (3 шт.)
масло
пельмени
макароны
Общий список: ['молоко', 'хлеб', 'шоколадка', 'масло', 'пельмени', 'макароны']
1. макароны
2. масло
3. молоко
4. пельмени
5. хлеб
6. шоколадка
Задание № 4 (sam04.py)
Вам дали задание найти максимальную и минимальную оценку за тест. Программа просит пользователя ввести n - количество оценок. После этого программа просит ввести n оценок. В итоге программа выводит максимальную и минимальную оценку.
Пример:
Введите количество оценок: 5
Введите оценку: 6
Введите оценку: 7
Введите оценку: 4
Введите оценку: 4
Введите оценку: 5
Максимальная оценка: 7, минимальная оценка: 4
Задание № 5 (sam05.py)
Создайте программу, которая создаёт аббревиатуру по введённым словам. Буквы в аббревиатуре должны быть большими.
Примеры:
Введите строку: запоминающее устройство
Аббревиатура: ЗУ
Введите строку: открытое акционерное общество
Аббревиатура: ОАО
Введите строку: Белорусский Государственный Педагогический Университет
Аббревиатура: БГПУ
Задание № 6 (sam06.py)
Пользователь вводит целое число n - количество элементов в списке. Затем программа просит пользователя ввести n чисел и сохраняет их в списке. Программа формирует новый список в котором сначала идут положительные, затем отрицательные числа исходного списка. Порядок положительных и отрицательных чисел должен совпадать с порядком в оригинальном списке. Выведите новый список на экран.
Исходные числа должны быть переставлены либо в исходном списке, либо расположены в новом списке.
Пример:
Введите количество чисел: 5
Введите оценку: -2
Введите оценку: -5
Введите оценку: 9
Введите оценку: -7
Введите оценку: 5
Ответ: [9, 5, -2, -5, -7]
Задание № 7 (sam07.py)
Пользователь вводит текст. Программа рассчитывает среднюю длину слов и выводит её на экран.
Пример:
Введите текст: Они работали в институте, который занимался прежде всего проблемами
человеческого счастья и смысла человеческой жизни, но даже среди них никто точно не знал,
что такое счастье и в чём именно смысл жизни. И они приняли рабочую гипотезу, что счастье
в непрерывном познании неизвестного и смысл жизни в том же.
Средняя длина слова в тексте: 5.29
Для того чтобы вывести определённое количество знаков после запятой в вещественных числах, используйте f-строки с таким форматом:
Число после точки определяет количество знаков после запятой.


