Главная страница
Навигация по странице:

  • 2. Преобразование строки

  • 3. Методы

  • 4. Генераторы списков

  • 5. Операции со списками

  • Метод Определение

  • 7. Практические задания

  • ЛР_5_Списки. Лабораторная работа 5 Списки


    Скачать 136.34 Kb.
    НазваниеЛабораторная работа 5 Списки
    Дата30.03.2023
    Размер136.34 Kb.
    Формат файлаdocx
    Имя файлаЛР_5_Списки.docx
    ТипЛабораторная работа
    #1027118

    Лабораторная работа 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())). Результат в этом случае не изменится и будет:



    Для добавления элемента в конец списка мы воспользовались встроенной функцией. Существует перечень методов списков, которые позволяют выполнять те или иные операции с ними.

    Метод

    Определение

    list.append(x)

    Добавляет элемент в конец списка

    list.extend(L)

    Расширяет список list, добавляя в конец все элементы списка L

    list.insert(i, x)

    Вставляет на i-ый элемент значение x

    list.remove(x)

    Удаляет первый элемент в списке, имеющий значение x. Возвращает сообщение об ошибке, если такого элемента не существует

    list.pop([i])

    Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент

    list.index(x [, start [, end]])

    Возвращает положение первого элемента со значением x (при этом поиск ведется от start до end)

    list.count(x)

    Возвращает количество элементов со значением x

    list.sort([key = функция])

    Сортирует список на основе функции

    list.reverse()

    Разворачивает список

    Нужно отметить, что методы списков, в отличие от строковых методов, изменяют сам список, а потому результат выполнения не нужно записывать в эту переменную.

    Используя таблицу, рассмотрим задачу, в которой создается список 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] …]


    написать администратору сайта