§7 Структуры данных. Списки. Цикл for

Списки

Структуры данных (англ. data structure) – это программная единица, позволяющая хранить и обрабатывать множество одного или различных типов данных. К структурам данных в python относятся последовательности. В python существуют пять видов последовательностей, один из них – список (list). В других языках программирования список также называется массивом. Списки принадлежат к изменяемым типам данных. Список может содержать любое количество любых объектов, в том числе и вложенные списки. Каждый элемент списка имеет номер (индекс), первый элемент имеет индекс [0]. Для того, чтобы создать список, необходимо перечислить данные через запятую и заключить их в квадратные скобки.
Программа 1

L = [5, 2, 9, 3, 6, 1, 7, 4, 8]
print(L)
[5, 2, 9, 3, 6, 1, 7, 4, 8]

Здесь L – имя списка. Обращаться к данным в списке теперь можно по имени и индексу:

print("L[0] =", L[0], "\nL[5] =", L[5])
L[0] = 5 
L[5] = 1

Для создания пустого списка необходимо выполнить следующую инструкцию L = [].
Для получения элементов списка (L) на основе строки, данные в которой разделены пробелами, можно воспользоваться функцией split():

L = input().split()

Если функция split() не имеет аргументов, то возвращается список, элементы которого были разделены пробелами. Если же используется иной разделитель, то он должен передаваться как аргумент, например split(".").
Примечание. Выражение input().split() возвращает список строк. Извлекая числа из данного списка, не забывайте использовать функции int() и float() для преобразования данных str -> int или str -> float. Для получения действительно числового списка необходимо использовать инструкцию с функциями map() и list() (см. программу 2).

Методы списка

Для работы со списками существует большое количество методов (функций). Эти методы модифицируют или производят иные операции над списками (ниже, в качестве имени списка, используется L):

  • L.append(x) Добавляет элемент х в конец списка L
  • L.count(x) Возвращает число вхождений элемента х в список L
  • L.extend(M) Добавляет в конец списка L все элементы объекта М; операция += делает то же самое (L += M)
  • L.index(x, first, last) Возвращает индекс первого вхождения элемента х в список L (или в срез списка L), в противном случае будет сгенерировано исключение ValueError
  • L.insert(pos, x) Вставляет элемент х в список L в позицию int pos
  • L.pop() Удаляет самый последний элемент из списка L и возвращает его в качестве результата
  • L.pop(i) Удаляет из списка L элемент с индексом int i и возвращает его в качестве результата
  • L.remove(x) Удаляет самый первый найденный элемент х из списка L или возбуждает исключение ValueError, если элемент х не будет найден
  • L.reverse() Переставляет в памяти элементы списка в обратном порядке
  • L.sort(key=...) Сортирует список в памяти

Постановка задачи. Дан список. Найти в списке минимальный и максимальный элементы. Выполнить сортировку элементов списка.
Программа 2

L = list(map(float, input().split()))
print("min =", min(L), "\nmax =", max(L))
L.sort()
i = 0
while(i < len(L)):
	print(L[i], "", end="")
	i += 1
1.0 2.3 1.2 4.4 3.2 5.1 2.5     
min = 1.0 
max = 5.1
1.0 1.2 2.3 2.5 3.2 4.4 5.1 

Программа выведет элементы исходного списка и упорядоченного, а также максимальный и минимальный элементы. Но, в отличие от вывода посредством обращения к имени списка (программа 1), запятые и квадратные скобки выведены не будут. Для определения максимального и минимального значения в списке используются стандартные функции max() и min().
Примечание. Обратите внимание, что функцию split() можно применить только к строке. Поэтому, в этой программе, используются функции map() и list(). Функция map() позволяет обрабатывать одну или несколько последовательностей с помощью заданной функции (в данном случае, int() будет выполняться над всеми элементами, полученными split()). Функция list() возвратит эту последовательность, как список. Эту инструкцию можно было бы заменить следующим кодом:

L = []
n = int(input('n = '))
a = n
while(n > 0):
	print("L[{:d}] = ".format(a-n), end="")
	L.append(int(input()))
	n -= 1

Главный недостаток этого кода – определение количества элементов в списке перед входом в цикл, тогда как split() может обработать строку произвольной длины. Выбор тех или иных подходов описанных здесь и ниже будет зависеть от решаемой задачи. Просто знайте, что Python способен очень компактно излагать сложные алгоритмы.

Цикл for

Перебор элементов последовательности можно производить циклом while (как в программе 2), но в python, для обхода последовательностей, существует цикл for.
Инструкция цикла for имеет следуюший вид:

for target_list in expression_list:
    Тело цикла
[else:
    Выражение]

Также как и цикл while, for имеет необязательный блок else.
Приведем два варианта вывода элементов списка (L) с помощью for.
Программа 3

L = [1, 2, 3, 4, 5]
for i in range(len(L)):
	print(L[i], "", end="")

Программа 4

L = [1, 2, 3, 4, 5]
for elem in L:
    print(elem, "", end="")

Результат работы программы 3 и 4 одинаков – будут выведены элементы списка в одну строку с разделителем “пробел”:

1 2 3 4 5 

В программе 3 используется функция range(n). Если эта функция имеет один аргумент (n), то будет создан список – арифметическая прогрессия с разностью 1: 0, 1, 2, ..., n-1. Значения элементов этого списка используются для связывания с переменной индекса i. Функция len() возвращает длину списка. Таким образом, выражение range(len(L)) сформирует список арифметическую прогрессию имеющую длину, равную длине списка L. В теле цикла элементы списка будут выводиться путем обращения по индексу. Похожим образом выглядят циклы for и в других языках программирования (например С, С++ и Pascal).
Функция range(), в общем виде, имеет следующий синтаксис:

range(старт, стоп, шаг)

Три аргумента позволяют создавать произвольные прогрессии. Например:
Программа 5

A = list(range(1, 10))
print(A)
B = list(range(10, 100, 10))
print(B)
C = list(range(20, 5, -2))
print(C)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 20, 30, 40, 50, 60, 70, 80, 90]
[20, 18, 16, 14, 12, 10, 8, 6]

Иначе дело обстоит в программе 4. Здесь цикл for используется по своему прямому назначению в python – обходу элементов последовательности: вместо индексов в цикле перебираются сами элементы списка (на которые указывает переменная elem).
Часто требуется получить случайные числа в списке. Для этого нужно воспользоваться, уже известным нам, модулем random и метод append().
Программа 6

from random import randint
L = []
n = int(input("Введите размер списка\nn = "))
for i in range(n):
	L.append(randint(10, 99))
for elem in L:
	print(elem, "", end="")
Введите размер списка
n = 10
94 57 74 33 18 42 29 55 22 29 

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

Генераторы позволяют в более компактной форме создать список. Например, программу 6 можно было бы переписать следующим образом:
Программа 7

from random import randint
L = [randint(10, 99) for i in range(10)]
print(L)
[18, 86, 26, 76, 98, 81, 25, 12, 48, 31]

Общий вид генератора следующий:

[выражение for переменная in последовательность]

В генераторах можно использовать логическое выражение с if. Например, в следующей программе создается список из целых чисел, в промежутке от 0 до 200, которые кратны 3 и 7.
Программа 8

L = [i for i in range(200) if not(i % 3) and not(i % 7)]
print(L)
[0, 21, 42, 63, 84, 105, 126, 147, 168, 189]

Генераторы не изменяют исходных списков, а создают новые:
Программа 9

A = list(range(1, 10))
B = [2 * it for it in A]
print(A)
print(B)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 4, 6, 8, 10, 12, 14, 16, 18]

Операции “+” и “*” применяемые к спискам

К спискам можно применять операции "+" и "*". Опреация "+" (конкатенация) – объединяет два списка или добавляет элемент к концу списка.
Операция "*" – повторение списка. С помощью этой операции можно заполнить список одним элементом или увеличить список за счет повторения одних и тех же элементов исходного списка.
Программа 10

А = [5] * 5
Б = [2] * 5
С = А + Б
print("А =", А)
print("Б =", Б)
print("С =", С)
А = [5, 5, 5, 5, 5]
Б = [2, 2, 2, 2, 2]
С = [5, 5, 5, 5, 5, 2, 2, 2, 2, 2]

Презентация к уроку

lesson-7-10-py

Домашнее задание

  1. Дано целое число N (> 0). Сформировать и вывести целочисленный массив размера N, содержащий N первых положительных нечетных чисел: 1, 3, 5, … .
  2. Дан целочисленный массив размера N. Вывести все содержащиеся в данном массиве нечетные числа в порядке возрастания их индексов, а также их количество K.
  3. Дан целочисленный массив размера N. Вывести вначале все содержащиеся в данном массиве четные числа в порядке возрастания их индексов, а затем — все нечетные числа в порядке убывания их индексов.

Источники

  1. Занятие 7. Списки
  2. Программирование на Python. Часть 3: Списки в питоне
  3. Функции map и zip и lambda. Python
Print Friendly, PDF & Email

Comments are closed.