ЛР_5_Списки. Лабораторная работа 5 Списки
Скачать 136.34 Kb.
|
Лабораторная работа 5 «Списки» 1. Перечисление элементов Списки в Python предназначены для хранения коллекций объектов. При чем в одном списке можно хранить элементы разных типов, в отличие от массивов на других языках программирования. Размер списка, то есть число элементов внутри него, можно изменять. Существует такой тип задач, которые требуют работать не с отдельными переменными, а с их набором. Список является такой структурой данных, в которой находится упорядоченный набор элементов. Каждый из элементов списка имеет свой индекс (порядковый номер), который позволяет быстро обратиться к нему. Нумерация элементов списка начинается с 0. Чтобы работать со списком, его необходимо создать. Самый простой способ – это обозначить список квадратными скобками, тогда все, что будет обозначено внутри скобок через запятую, будет считаться его элементами. Рассмотрим несколько созданных списков. Внутри списка s хранятся исключительно числовые значения. Список color хранит строковые данные, а список sm – одновременно и числовые и строковые значения. s = [1, 43, -9] color = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'violet'] sm = [900, 'world', -8.7, 11] Такой способ создания удобен, если элементы внутри списка уже известны, однако чаще всего вводить элементы списка необходимо пользователю. Рассмотрим другие способы создания списков. 2. Преобразование строки Если пользователь ввел строку и каждый ее символ необходимо сделать отдельным элементом списка, тогда удобно воспользоваться командой list(), а внутри скобок прописать переменную, которую нужно преобразовать в список. stroka = input() a = list(stroka) print(a) Важно помнить, что все символы будут добавлены как отдельные элементы, причем подряд, даже если внутри введенной строки были пробелы, они будут занесены в созданный список. Что мы и наблюдаем в примере. 3. Методы split() и join() Обратимся к условию ввода элементов списка в предыдущем примере, когда на вход мы получили строку. Но на этот раз учтем, что пробелы мы рассматриваем как символ-разделитель между вводимыми элементами и внутрь списка их не вносим. res = input() #ввод строки sp = res.split() #разбиение строки на элементы списка print(sp) В результате строка, которую мы ввели, была разбита по пробелам. Важно помнить, что метод split() может разбить строку по любому символу, который мы укажем в качестве разделителя, это не обязательно должны быть пробелы. Рассмотрим случай, когда элементом списка должно стать предложения. Разделителем между элементами в таком случае назначим точку и пробел после нее. text = input() #ввод строки res = text.split('. ') #разбиение строки for i in res: #вывод списка по элементам print(i) В результате получим следующий список из нашей строки: Однако иногда при разбиении строки необходимо не просто разбить ее на элементы, но также присвоить эти элементы списку определенной длины, тогда в методе split(‘разделитель’, m) нужно указать не только символ-разделитель, но и максимальное количество разделений m, тогда длина самого списка будет на 1 больше, то есть n = m+1. Изменим наш прошлый пример, указав, что предложения мы будем делить максимально 3 раза, тогда в списке будет всего 4 элемента. И все, что останется в строке после последнего разделения (после точки третьего предложения и далее) будет как значение последнего элемента списка. text = input() #ввод строки res = text.split('. ', 3) #разбиение строки for i in range(len(res)): #вывод элементов с индексами print(i, ':', res[i]) Попробуем изменить и вывод самих элементов списка, в цикле обратимся не к самим элементам списка, а к их индексам, тогда перебор i будем выводить значения от 0 и до конца длины списка len(res). Так как цикл теперь получает числовое значение (индекс элементов списка), то обращаться к каждому элементу тоже необходимо иначе, а именно указывая название списка и в квадратных скобках индекс элемента, который хотим получить. Например, res[1] будет равен res[1] = 'Прекрасный день'. Результатом выполнения программы, описанной выше, будет: В Питоне можно вывести список строк при помощи однострочной команды. Для этого используется метод join(). У этого метода один параметр: список строк. В результате возвращается строка, полученная соединением элементов переданного списка в одну строку, при этом между элементами списка вставляется разделитель, равный той строке, к которой применяется метод. Давайте разберем задачу, в которой требуется объединить элементы списка в строку. Применять метод join() мы будем к переменной p, которая содержит разделитель элементов списка. Для наглядности введем символ нижнего подчеркивания. А в скобках как раз передадим список, который требуется вывести на экран. text = ['За', 'окном', 'идет', 'снег'] p = '_' s = p.join(text) print(s) Попробуем применить метод join()к числовому ряду, чтобы вывести его элементы через запятую. number = [1, 3, 10, -5, 16] q = ',' print(q.join(number)) Однако при попытке запустить код, мы увидим сообщение об ошибке, так как данный метод может работать исключительно со строковыми значениями. Перепишем код, добавив преобразование элементов списка в строку str(number[i]). number = [1, 3, 10, -5, 16] for i in range(len(number)): number[i] = str(number[i]) #преобразование в строку q = ',' print(q.join(number)) 4. Генераторы списков Следующий способ создания подразумевает использование генератора списков. Для создания списка, заполненного одинаковыми элементами, можно использовать оператор повторения. n = 5 a = [5] * n print(a) b = ['word'] * 3 print(b) В итоге будут созданы список a, состоящий из пяти 5, и список b, состоящий из трех слов word. Для создания списков, заполненных по формуле, можно использовать генераторы – выражения, позволяющие заполнить список некоторой формулой. Общий вид генератора следующий: [выражение for переменная in последовательность] где переменная – идентификатор некоторой переменной; последовательность – последовательность значений, которую принимает данная переменная (список, строка, объект, полученный от функции range()); выражение – некоторое выражение, зависящее от использованной в генераторе переменной, которым будут заполнены элементы списка. Создадим список, состоящий из 5 нулей. a = [0 for i in range(5)] print(a) Усложним задачу и заполним список кубами чисел от 1 до n. n = int(input("Длина списка ")) a = [i ** 3 for i in range(1, n + 1)] print(a) Попробуем заполнить список (длины 10) случайными числами от 1 до 20, для этого используем функцию randrange из модуля random. Не забудем подключить библиотеку random. from random import * n = 10 a = [randrange(1, 10) for i in range(n)] print(a) 5. Операции со списками Еще один способ создать список – это создать пустой список, и просто заполнить его элементами, например, используя цикл. Рассмотрим пример, где у пользователя сначала спрашивают длину списка, а затем просят ввести его элементы. n = int(input()) #длина списка s = [] #создаем пустой список print('Список ДО:', s) for i in range(n): #заполняем список x = int(input()) s.append(x) print('Список ПОСЛЕ:', s) Выведем список до заполнения и после него, чтобы проверить, что внутри сначала не было элементов, а затем они были добавлены в список с помощью команды s.append(x), где s – название списка, x – значение нового элемента. В задаче мы добавляли значения с клавиатуры, однако строки x = int(input()) и s.append(x) можно было заменить одной строкой: s.append(int(input())). Результат в этом случае не изменится и будет: Для добавления элемента в конец списка мы воспользовались встроенной функцией. Существует перечень методов списков, которые позволяют выполнять те или иные операции с ними.
Нужно отметить, что методы списков, в отличие от строковых методов, изменяют сам список, а потому результат выполнения не нужно записывать в эту переменную. Используя таблицу, рассмотрим задачу, в которой создается список a и список b. Значение третьего элемента списка a необходимо заменить на 0. В списке b найти индекс элемента равного -6 и удалить его, а на место 2 элемента добавить число 100. После чего необходимо объединить оба списка и отсортировать их. a = [-3, 2, 15, -7, 32, 90] b = [1, 4, -6, 8] a[2] = 0 #замена значения 3 элемента #(нумерация 0, 1, 2...) print('Измененный а', a) print(b.index(-6)) #поиск индекса числа равного -6 b.remove(-6) #удаление элемента равного -6 b.insert(1, 100) print('Измененный b', b) a.extend(b) #добавление в конец a списка b print('Объединенные списки', a) a.sort() #сортировка по возрастанию print('Отсортированный список', a) Помимо специальных функций со списками также можно выполнять следующие операции: конкатенация (сложение) списков, когда в конец одного списка приписывается другой; повторение списков (умножение списка на число). Например: a = [1, 2, 3] b = [4, 5] c = a + b #конкатенация print('Конкатенация', c) print('Конкатенация', [7, 8] + [9]) #конкатенация d = b * 3 #повторение print('Повторение', d) print('Повторение',[0, 1] * 3) #повторение В результате список c будет состоять из элементов списка a и b,тогда как список d будет состоять из элементов списка b, повторенных три раза. Аналогичные операции можно выполнять, прописывая списки явно, не присваивая их значение переменным. Рассмотрим еще одну задачу, которая создает список длины, введенной с клавиатуры, заполненный 0. А после переписывает его значения, заменяя 0, переменной пользователя. a = [0] * int(input("Длина списка ")) #создание списка print('До', a) for i in range(len(a)): #изменение значений через цикл a[i] = int(input()) print('После', a) Результатом работы программы будет: 6. Срезы Со списками, как и со строками, можно делать срезы. Общая конструкция срезов имеет вид (где каждое из чисел i или j может отсутствовать, что означает “начало строки” или “конец строки”): A[i:j] – срез из j-i элементов A[i], A[i+1], ..., A[j-1]; A[i:j:-1] – срез из i-j элементов A[i], A[i-1], ..., A[j+1], то есть меняется порядок элементов на обратный; A[i:j:k] – срез с шагом k: A[i], A[i+k], A[i+2*k]...Если значение k < 0, то элементы идут в противоположном порядке. Списки, в отличии от строк, являются изменяемыми объектами: можно отдельному элементу списка присвоить новое значение. Но можно менять и целиком срезы. Например, заменим элементы с индексами 2-4 другими значениями. a = [1, 2, 3, 4, 5] a[2:4] = [7, 8, 9] print(a) Тогда список станет равен: Срезы удобно использовать если необходимо вывести список в обратном порядке, либо получить элементы с определенным шагом, например, каждый второй. a = [1, 2, 3, 4, 5, 6] print(a[::-1]) #вывод списка в обратном порядке print(a[::-2]) #вывод с конца и через 1 элемент print(a[::2]) #вывод через 1 начиная с 0 элемента print(a[1::2]) #вывод через 1 начиная с 1 элемента 7. Практические задания Задача 1. Создайте список длины n: а) все элементы которого равны 3; б) элементы которого вводятся пользователем с клавиатуры и являются словами; в) запишите его в обратном порядке; г*) элементы которого принимают удвоенное значение от 1 до n+1. Для заполнения списка использовать генератор. Задача 2. В списке внесена успеваемость второклассника по математике за вторую четверть (оценки выставлены по десятибалльной системе и могут принимать значения от 1 до 10): mark = [8, 6, 9, 3, 3, 10, 8, 6, 1]. Внесите в список оценки с прошлой четверти равные: score = [10, 2, 2, 4], отсортируйте их в порядке возрастания. Выведите получившийся список, в формате: «1; 2; 2; 3» (разделяя элементы списка точкой с запятой и пробелом). Вычислите средний балл ученика по предмету. Задача 3. Создайте список из чисел, делящихся на 2 и 5 или кратных 7 в диапазоне от 1 до 9999. а) найдите решение любым возможным способом б*) для решения используйте генератор Задача 4. Дан список длины n. Пользователя просят ввести два числа k и m (где k < m), которые находятся в пределах от 1 до n-1. Эти числа разбивают исходный список на 3 части. Поменяйте крайние (правую и левую) части местами. Задача 5. В списке сохранены размеры формы для футбольной команды (11 человек) в диапазоне от 42 до 56 размера. Создайте новый список, в котором будут сохранены все различные размер, которые необходимо будет заказать при пошиве формы. Задача 6. Дан список длиной 20, заполненный пользователем. Все числа списка равные 12 замените значением -100. Создайте новый список, который запомнит индексы элементов, в которых была выполнена замена. Задача 7*. Дан список чисел длиной n, элементы которого генерируются случайным образом в диапазоне от 1 до 200. Посчитайте, сколько в нем пар элементов, равных элементов. Парой будут считаться два любых элемента, значения которых совпали. Использовать элементы из найденной пары в другой паре уже нельзя. Задача 8*. Дано два списка. Первый список entrant содержит Фамилии абитуриентов, поступающих в университет, где индекс – это номер абитуриента. Второй список mark содержит баллы набранные в конкурсе портфолио (от 0 до 100 баллов). Внесите в новый список фамилии только поступивших абитуриентов, то есть только тех, чьи проходные баллы превысили порог в 42 балла. Объедините два исходных списка entrant и mark парами по принципу [[Абитуриент 1, балл 1], [Абитуриент 2, балл 2] …] |