НМЦ

Програмування мовою Python: основи та практика

Електронний посібник

ВФПО

ТЕМА 7.1. СПИСКИ

 

 

 

 

Уроки Python з нуля / #7 – Списки (list). Функції та їх методи

 

Презентація. Списки в PYTHON №7

 

 

Список ‒ це впорядкований набір елементів.

У певному сенсі списки в Python відіграють роль, аналогічну ролі масивів в інших мовах програмування. Але це тільки «у певному сенсі». Насправді, список у Pythonце виключно гнучка, ефективна й десь навіть унікальна річ. Досить сказати, що елементами списку є об’єкти (дані) різного типу.

 

Ба більше, елементами списку так само можуть бути списки. Тобто за допомогою списків ми можемо створювати вкладену структуру практично будь-якої (в розумних межах, зрозуміло) складності.

Список є змінюваним, тобто може змінюватися після створення. Відображається як послідовність елементів, розділених комами та укладених у квадратні дужки:[1, 2, 3, Hello’].

 

 

Для задання порожнього списку можна скористатися однією з команд:

>>> a=[]

>>> a=list()

 

Задання списку з наперед заданим набором елементів:

>>> a=[1, 2, 3, 4]

>>> b=[‘Hello’, 2, True]

 

 

Список можна отримати з елементів об’єкта, що може ітеруватися (діапазон, рядок, словник, множина, кортеж, файл тощо) використавши функцію list([iterable]):

>>> b=list(‘Hello’)

>>> print(b)

[‘H’, ‘e’, ‘l’, ‘l’, ‘o’]

>>> c=list(range(10))

>>> print(c)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9

 

Об’єднання списків

 

Нові списки можуть бути створені методом конкатенації (об’єднання) декількох списків в один. Для цього використовується перевизначена операція додавання («+»).

>>> b=[1, 3, 5, 7, 9]

>>> d=[10, 11, 12]

>>> c=b+d

>>> print(c)

[1, 3, 5, 7, 9, 10, 11, 12]

 

Багаторазове повторення елементів

 

Аналогічно до перевизначеної операції («+»), для списків в мові Python перевизначена і операція множення «*». Якщо виконати операцію «*» списку a на ціле число n, то як результат буде отриманий список, що складається з n повторень списку a:

>>> a=[0]*5

>>> print(a)

[0, 0, 0, 0, 0]

 

Введення або генерування елементів списку

 

Числові елементи списку можна згенерувати випадковим чином, скориставшись функціями модуля random, наприклад:

import random

n=int(input(‘Введіть кількість елементів списку =‘))

a=[]

for i in range(n):

    x=random.randint(1,100)

    a.append(x)

 

Для випадку, коли необхідно створити список з елементів, які задаватиме користувач, можна скористатися таким фрагментом коду:

n=int(input(‘Введіть кількість елементів списку = ‘))

a=[]

for i in range(n):

   x=int(input(‘a[{}]=‘.format(i)))

     # або x=int(input(‘a[‘+str(i)+’]=‘))

   a.append(x)

 

Якщо ж елементи списку задаватимуться одним рядком через пропуск, то для формування такого списку можна скористатися таким фрагментом коду:

a=list(map(int, input(‘Введіть елементи списку через пропуск:  ‘).split()))

 

Звертаючись до елементу списку, можна зазначати від’ємний індекс –. У такому разі елементи «відраховуються», починаючи з кінця списку. Зокрема, останній елемент матиме індекс – 1, передостанній елемент матиме індекс – 2 і так далі.

 

 

У науці та програмуванні випадкові числа широко використовують з різноманітними цілями. Модуль random має набір функцій, які генерують випадкові числа, символи або вибірку елементів з послідовності. Цей модуль базується на системному часі для налаштування генератора випадкових чисел, що означає, що під час кожної ініціалізації генерується нова послідовність.

 

Треба зауважити, що отримані випадкові числа насправді базуються на спеціальних алгоритмах і не є повністю випадковими, хоча для практичних цілей їх часто вважають такими. Такий тип чисел іноді називають псевдовипадковими.

 

Щоб користуватися функціями цього модуля, спочатку необхідно імпортувати його, використовуючи команду import random.

 

 

random.random(). Повертає псевдовипадкове дійсне число з діапазону [0.0, 1.0).

random.randrange(stop). Повертає псевдовипадкове ціле число від 0 до stop-1.

random.randrange(start, stop[, step]). Повертає псевдовипадкове ціле число від 0 до stop-1 з кроком step. Початково параметр step=1.

>>> random.randrange(10)

5

>>> random.randrange(3,10)

6

>>> random.randrange(3,10,3)

9

random.uniform(A, B). Повертає псевдовипадкове дійсне число, що належить відрізку [A, B] або [B, A].

random.randint(A, B). Повертає псевдовипадкове ціле число, що належить відрізку [A, B].

random.choice(sequence). Повертає випадковий елемент з послідовності sequence (рядка, списку, кортежу тощо).

>>> random.choice(‘рядок’)

я

>>> random.choice([‘a’,’b’,’c’])

‘b’

random.shuffle(sequence, [rand]). Перемішує та повертає елементи послідовності sequence (рядка, списку, кортежу тощо). Оскільки змінюється сама послідовність, то функція не застосовна для незмінних об’єктів. Необов’язковий аргумент rand є функцією без аргументів, що повертає випадкове значення з діапазону [0.0, 1.0), стандартно використовуватиметься random.random.

>>> arr=[1,2,3,4,5,6,7,8,9,0]

>>> random.shuffle(arr)

>>> arr

[9, 2, 6, 3, 1, 0, 7, 8, 5, 4]

random.sample(population, k). Повертає список з псевдовипадкових k елементів послідовності population (рядка, списку, кортежу тощо). k не може бути більше за довжину послідовності population.

>>> random.sample(‘рядок’, 2)

[‘р’, ‘д’]

>>> arr=[1,2,3,4,5,6,7,8,9,0]

>>> random.sample(arr,3)

[7, 8, 3]

>>> random.sample(range(300),5)

[69, 161, 211, 23, 208]

random.getrandbits(N). Повертає псевдовипадкове ціле число, бітовий запис якого не перевищує N біт.

 

Функції налаштування генератора

 

random.seed(X=None, version=2). Налаштування стану генератора випадкових чисел на нову послідовність генерації. Для однакового значення параметра X генеруються однакові послідовності. Як значення параметра X початково використовується системний час.

random.seed(20)

random.random()

0.9056396761745207

random.random()

0.6862541570267026

random.seed(20)

random.random()

0.9056396761745207

random.random()

0.7665092563626442

random.getstate(). Повертає обєкт, що фіксує поточний внутрішній стан генератора. Цей об’єкт може бути переданий в setstate() для відновлення стану.

random.setstate(state). Відновлює внутрішній стан генератора. Параметр state має бути отриманий функцією getstate().

 

Імовірнісні розподіли

 

random.triangular(low, high, mode) – трикутний розподіл. Повертає псевдовипадкове дійсне число з відрізка [low, high]. Параметр mode задає режим розподілу lowmode high.

random.betavariate(alpha, beta) бета-розподіл. Повертає псевдовипадкове дійсне число з відрізка [0.0, 1.0]. Параметри alpha і beta мають бути більше ніж нуль.

random.expovariate(lambd) експоненціальний розподіл. Параметр lambd має бути відмінним від нуля і дорівнювати 1/(бажане середнє значення). Повертає псевдовипадкове число з інтервалу (0, + ¥ ), якщо lambd > 0 або з інтервалу (- ¥ , 0), якщо lambd < 0.

random.gammavariate(alpha, beta) гамма-розподіл.

Параметри alpha і beta  мають бути більше ніж нуль.

random.gauss(mu, sigma) розподіл Гауса. Параметр mu задає середнє значення, sigma стандартне відхилення. Дещо швидше, ніж функція random.normalvariate().

random.lognormvariate(mu, sigma) логарифм нормального розподілу. Якщо взяти натуральний логарифм цього розподілу, то ви отримаєте нормальний розподіл із середньою сігмою mu і стандартним відхиленням. sigma. mu може мати будь-яке значення, а sigma має бути більше ніж нуль.

random.normalvariate(mu, sigma) нормальний розподіл.

Параметр mu задає середнє значення, sigma стандартне відхилення.

random.vonmisesvariate(mu, kappa) круговий розподіл. mu середній кут (в радіанах від 0 до 2π), kappa параметр концентрації (kappa 0). Якщо kappa дорівнює нулю, це розподіл зводиться до випадкового кутка в діапазоні від 0 до 2π.

random.paretovariate(alpha) розподіл Парето. alpha – параметр форми.

random.weibullvariate(alpha, beta) розподіл Вейбулла.

alpha параметр масштабу, beta параметр форми.

 

Пікантність ситуації в тому, що будь-який генератор випадкових чисел насправді «видає» зовсім не випадкові числа. Тому правильніше говорити про псевдовипадкові числа. Зовнішньо дуже схоже, що числа випадкові – але це не так. Для отримання послідовності таких чисел використовують певну формулу або алгоритм. І щоб усе це «запустити», потрібно якесь початкове значення, яке беруть за основу під час обчислення послідовності псевдовипадкових чисел. Таке вкрай важливе для генератора випадкових чисел значення, зазвичай, задається під час ініціалізації генератора випадкових чисел – фактично, у цьому ініціалізація генератора чисел і полягає. Якщо ми в явному вигляді ініціалізуємо генератор, викликавши функцію seed() із певним аргументом, то цей аргумент використовується для «старту» обчислювального процесу. Тому щоразу послідовність псевдовипадкових чисел буде одна й та сама. Якщо явно ініціалізація генератора випадкових чисел не виконується, то початкове значення визначається на основі системного часу, тому щоразу під час запуску програми отримуємо нову послідовність псевдовипадкових чисел.

 

Приклад. Генерація випадкового пароля Надійний пароль має містити мінімум 8 символів, серед яких можуть бути цифри, рядкові і прописні літери. Згенерувати пароль можна так:

import random

str1 = ‘123456789’

str2 = qwertyuiopasdfghjklzxcvbnm

str3 = str2.upper()

str4 = str1+str2+str3

ls = list(str4)

random.shuffle(ls)

psw = ‘‘.join([random.choice(ls)

for x in range(8)])

print(psw)

1t9G4YPs

 

 

Можна створювати списки за допомогою генераторних виразів (List Comprehensions), що іноді називають «абстракцією списків» або «списковими включеннями». Це частина синтаксису Python, яка пропонує простий метод побудови списків.

 

Генератори списків дають змогу зручно створювати список, де кожен елемент генерується на основі певної операції, що застосовується до елементів іншого списку або послідовності. Також можна створювати список, вибравши лише ті елементи, які відповідають певній умові.

Генератор списку включає квадратні дужки, які містять вираз для формування кожного елементу списку, та цикл for для ітерації по елементах іншої «базової» послідовності. Також можна застосовувати умову if для обмеження елементів, які додаються до списку.

Створення списку цілих чисел від 0 до 10:

>>> a=[i for i in range(11)]

>>> print(a)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Створення списку, який містить 5 нулів:

>>> a=[0 for i in range(5)]

>>> print(a)

[0, 0, 0, 0, 0]

Створення списку з елементів, які є квадратами чисел від 1 до 4:

>>> a=[i ** 2 for i in range(1, 5)]

>>> print(a)

[1, 4, 9, 16]

Створення списку цілих непарних чисел, менших за 10:

>>> a=[i for i in range(10) if i%2==1]

>>> print(a)

[1, 3, 5, 7, 9]

Створення списку з 10 елементів, що заповнений випадковими числами від 1 до 9:

>>> import random

>>> a=[random.randrange(1, 10) for i in range(10)]

>>> print(a)

[8, 7, 1, 3, 4, 6, 1, 3, 7, 1]

Створення списку, елементами якого будуть пари чисел, які є елементами двох інших списків:

>>> a=[ (x, y) for x in [1, 2, 3] for y in [4, 5]]

>>> print(a)

[(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)]

Попередня команда еквівалентна, до

a=[]

for x in [1,2,3]:

  for y in [4, 5]:

  a.append((x, y))

print(a)

[(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)]

 

 

Доступ до елементів списку відбувається за їх індексами. Як і в багатьох інших мовах, нумерація елементів починається з нуля. Для того щоб звернутися до елементу списку, необхідно вказати ім’я змінної списку та в квадратних дужках індекс необхідного елементу (ім’я_списку[індекс]).

>>> b=[1, 3, 5, 7, 9]

>>> b[1]

3

За спроби доступу до неіснуючого індексу виникає виняток IndexError.

>>> b[5]

Traceback (most recent call last):

File «<pyshell#27>«, line 1, in <module>

b[5]

IndexError: list index out of range

 

Якщо ж розглянути всі індекси для списку [1, 3, 5, 7, 9], отримаємо:

 

список b

1

3

5

7

9

Індекс

b[0]

b[1]

b[2]

b[3]

b[4]

Індекс

b[-5]

b[-4]

b[-3]

b[-2]

b[-1]

 

Можна перевірити приналежність деякого елементу до списку, використовуючи оператор in (значення in ім’я_списку).

>>> a=[1, 3, 5, 7]

>>> 3 in a

True

>>> 4 in a

False

Для протилежної перевірки, що елемент не належить списку, може бути використаний оператор not in.

>>> 4 not in a

True

Раніше зазначалося, що, використовуючи цикл for, можна перебрати всі елементи послідовності, а отже, і списку. Тому команда виведення елементів списку окремими рядками матиме вигляд:

>>> for i in b:

print(i)

А команда виведення елементів списку через пропуск:

>>> for i in b:

print(i, end=‘ ‘)

 

Зрізи (slice)

 

Часто потрібно отримати не один елемент списку за його індексом, а декілька елементів за певним правилом, наприклад, перші п’ять елементів або кожен другий. У таких випадках набагато зручніше скористатися зрізом (slice, slicing) замість перебору в циклі.

Зріз дає змогу отримати певну підмножину елементів зі списку, і сам зріз є списком. Отримання одного елементу списку можна розглядати як найпростіший випадок використання зрізу.

 

Задати зріз можна одним з двох варіантів:

item[start: stop]. item[start: stop: step].

 

Для списку item береться зріз від індексу start, до stop (не включаючи його), з кроком step. Також під час запису зрізу деякі, а можливо і всі параметри можуть бути опущені (знаки двокрапки в записі все рівно залишаються). У разі відсутності деяких параметрів їх значення встановлюється як усталено, а саме: start = 0, stop = кількості елементів списку, step = 1.

>>> a = [1, 3, 8, 7]

>>> a[1:3]

[3, 8]

Якщо опустити другий параметр (залишивши двокрапку), то зріз береться до кінця рядка. Наприклад, щоб отримати зріз без першого елементу, можна записати a[1:]. Якщо ж опустити перший параметр, то отримаємо зріз, який містить вказану кількість елементів, що йдуть на початку списку.

>>> a[1:]

[3, 8, 7]

>>> a[:3]

[1, 3, 8]

>>> a[:]

[1, 3, 8, 7]

У разі задання значення третього параметра, який дорівнює 2, у зріз потрапить кожний другий елемент списку.

>>> a[::2]

[1, 8]

>>> a[1::2]

[3, 7]

У разі, якщо параметри start і stop мають від’ємні значення, то нумерація відбуватиметься з кінця (кількість символів рядка + від’ємний індекс).

Наприклад, a[-2:] – це список з останніх двох елементів.

>>> a[-2:]

[8, 7]

>>> a[:-2]

[1, 3]

>>> a[-3:-1] [3, 8]

Якщо параметр step має від’ємне значення, то зріз береться справа наліво.

>>> a[::-1]

[7, 8, 3, 1]

>>> a[-2::-1]

[8, 3, 1]

>>> a[1:4:-1]

[]

 

В останньому прикладі було отримано порожній список, оскільки start < stop, а step від’ємний. Те саме відбудеться, якщо діапазон індексів виявиться за межами списку.

>>> a[10:20]

[]

 

Щодо третього індексу kкоманді вигляду список[i:j:k]), то його значення не може бути нульовим, а якщо цей індекс не вказаний (команда вигляду список[i:j:] або список[i:j]), то як усталено використовується одиничне значення.

 

 

Оскільки списки можна змінювати, можна модифікувати та вилучати окремі їхні елементи без застосування спеціальних методів, які будуть представлені нижче.

 

Зміна елементів списку

 

Оскільки списки дають змогу змінювати їхні елементи, можна виконати заміну одного чи кількох елементів у списку. Для цього потрібно звернутися до елементу списку за його індексом, використовуючи квадратні дужки, і присвоїти нове значення цьому елементу: (ім’я_списку[індекс]=нове_значення).

>>> b=[1, 3, 5, 7, 9]

>>> b[2]=10

>>>  print(b)

[1, 3, 10, 7, 9]

Змінювати також можна не один елемент, а відразу декілька, використовуючи зрізи.

>>> b[1:3]=[11,12]

>>> print(b)

[1, 11, 12, 7, 9]

Також, використовуючи зріз, елементи можна навіть додавати.

>>> b[1:3]=[2,3,4,5,6]

>>> print(b)

[1, 2, 3, 4, 5, 6, 7, 9]

>>> b[len(b):]=[11,12,13]

>>> print(b)

[1, 2, 3, 4, 5, 6, 7, 9, 11, 12, 13]

Проте варто зауважити, що під час спроби додати список елементів не зрізу, а одному елементу, отримаємо заміну цього елементу на окремий список.

>>> b[0]=[0, 1]

>>> print(b)

[[0, 1], 2, 3, 4, 5, 6, 7, 9, 11, 12, 13]

 

Вилучення елементів списку

 

Для вилучення елементу списку за його індексом можна скористатися командою del (del ім’я_списку[індекс]).

>>> a=[1, 3, 5, 1, 3]

>>> del a[2]

>>> print(a)

[1, 3, 1, 3]

Також команда del може бути використана для вилучення зрізу із списку чи очищення всього списку

>>> del a[1:3]

>>> print(a)

[1, 3]

>>> del a[:]

>>> print(a)

[]

 

 

Змінна, яка призначена для зберігання списку, посилається на область у пам’яті, яка містить посилання на об’єкти (елементи) цього списку. На відміну від числових типів даних, списки є змінюваними, тому їхній вміст можна змінювати, розширювати або скорочувати.

 

Присвоювання списків

 

Коли ми присвоюємо один список іншій змінній, зазвичай, через звичайне присвоєння, це призводить до того, що обидва списки насправді посилаються на один і той самий об’єкт у пам’яті. І якщо будь-який з цих списків зміниться, це вплине на обидва, оскільки вони вказують на одну і ту саму область пам’яті.

>>> a=[1, 3, 5, 7, 9]

>>> b=a

>>> a[1]=2

>>> print(b)

[1, 2, 5, 7, 9]

>>>> id(a)

19733680

>>>> id(b)

19733680

Тому для створення нового списку, який буде копією цього, необхідно скористатися зрізом або функцією list().

>>> a=[1, 3, 5, 7, 9]

>>> b=a[:]

>>> a[1]=2

>>> print(b)

[1, 3, 5, 7, 9]

>>> c=list(a)

>>> a[2]=4

>>> print(c)

[1, 2, 5, 7, 9]

>>> id(a)

17285288

>>> id(b)

17343232

>>> id(c)

24285432

 

7.1.7. Методи списків

 

list.append(x). Додає елемент x в кінець списку list.

Аналогічно командам a[len(a):]=[x].

>>> a=[1,2]

>>> a.append(3)

>>> print(a)

[1, 2, 3]

list.extend(iterable). Розширює існуючий список list через додавання до нього всіх елементів з iterable. Аналогічно командам a[len(a):]=iterable.

>>> a=[1,2]

>>> a.extend([3,4])

>>> print(a)

[1, 2, 3, 4]

list.insert(n, x). Вставляє в список list елемент x в позицію n (індекс елементу, після якого буде вставлений елемент).

>>> a=[1,2]

>>> a.insert(1, 5)

>>> print(a)

[1, 5, 2]

>>> a.insert(len(a), 9)

>>> print(a)

[1, 5, 2, 9]

list.remove(x). Вилучає перше входження елементу x зі списку list.

>>> a=[1, 2, 3, 1, 2]

>>> a.remove(1)

>>> print(a)

[2, 3, 1, 2]

list.pop([n]). Вилучає з списку list елемент з позиції n та повертає його як результат виконання функції. Якщо використовувати метод без параметру, то буде вилучений останній елемент списку.

>>> a=[1,2,3,4,5]

>>> print(a.pop(2))

3

>>> print(a.pop())

5

>>> print(a)

[1, 2, 4]

list.clear(). Очищує список list (вилучає всі елементи зі списку). Аналогічно до del a[:].

>>> a=[1,2,3,4,5]

>>> a.clear()

>>> print(a)

[]

list.index(x[, start[, end]]). Повертає індекс першого входження елементу x в зрізі list[start: end] (необовязкові параметри start та end інтерпретуються як нотації зрізу). Значення, що повертається, є індексом списку list. Якщо елементу в списку не знайдено, виникає виняток ValueError.

>>> a=[1, 2, 3, 1, 2, 3, 1, 2, 3]

>>> print(a.index(3))

2

>>> print(a.index(3,3))

5

list.count(x). Повертає кількість входжень елементу x в список.

>>> a=[1, 2, 3, 1, 2, 3, 1, 2, 3]

>>> print(a.count(2))

3

list.sort(key=None, reverse=False). Відсортовує елементи списку (аргументи методу можуть бути використані для налаштування сортування). Як усталено сортування відбувається за зростанням. Для сортування в зворотному порядку використовуйте параметр reverse = True. Як результат сортування змінюється сам список.

>>> a=[1, 2, 4, 3, 2, 6, 5]

>>> a.sort()

>>> print(a)

[1, 2, 2, 3, 4, 5, 6]

>>> a.sort(reverse=True)

>>> print(a)

[6, 5, 4, 3, 2, 2, 1]

list.reverse(). Змінює порядок розташування елементів у списку на зворотний. Змінюється сам список.

>>> a=[1, 2, 4, 3, 2, 6, 5]

>>> a.reverse()

>>> print(a)

[5, 6, 2, 3, 4, 2, 1]

list.copy(). Повертає копію списку. Аналогічно a[:].

>>> a=[1, 3, 5]

>>> b=a.copy()

>>> print(b)

[1, 3, 5]

 

 

Списки можна порівнювати між собою, але це відбувається поелементно. Щоб порівняти два списки, важливо, щоб їх відповідні елементи мали однаковий тип або методи порівняння. Порівняння відбувається за лексикографічним порядком, починаючи з перших елементів. Якщо вони різні, вони і визначають результат порівняння. Якщо елементи рівні, порівнюються наступні. Якщо обидва порівнювані елементи є списками, порівняння відбувається рекурсивно. Якщо всі елементи списків рівні, то списки вважаються однаковими. Якщо один список збігається з початком іншого, то менший вважається тим, що коротший.

 

Кілька прикладів порівняння, результатом яких буде істина (True):

[1,

2,

3]

 

< 

[1,

2,

4]

[1,

2,

3,

4]

< 

[1,

2,

4]

[1,

2]

 

 

< 

[1,

2,

-1]

[1, 2, 3] == [1.0, 2.0, 3.0]

[1, 2, [‘aa’, ‘ab’]] < [1, 2, [‘abc’, ‘a’], 4]

 

 

Часто в задачах доводиться зберігати прямокутні таблиці з даними. Такі таблиці називають матрицями або двовимірними масивами.

 

В загальному випадку матриця записується так:

 

 

За аналогією з одновимірними масивами, які в мові Python подаються списками, двовимірний масив можна подати у формі списку (двовимірного списку), кожен елемент якого так само є списком.

>>> a=[[1, 2, 3], [4, 5, 6]]

До елементів такого списку можна звертатися так само, як і до елементів звичайного списку, лише враховуючи, що перший вимір (рядки) також є списком.

>>> print(a[0])

[1, 2, 3]

>>> print(a[0][1])

2

>>> a[1][0]=10

>>> print(a)

[[1, 2, 3], [10, 5, 6]]

Можна застосовувати аналогію для пояснення тривимірних списків і таких, що мають нескінченну вкладеність.

У Python списки можуть бути гнучкими щодо кількості елементів у вкладених структурах, наприклад, a = [[1, 2], [4, 5, 6]].

 

Для опрацювання та виведення вкладених списків часто використовують вкладені цикли. Кожен цикл проходить відповідно за виміром списку: для двовимірних списків, зазвичай, використовують два цикли. Перший цикл проходить елементи основного списку, другий ‒ елементи вкладених списків.

 

Задання двовимірних списків

 

Заповнити двовимірний список (масив) розмірності 4х5 нулями можна декількома способами.

 

Перший спосіб. Спочатку створити список з чотирьох нульових елементів. Далі розширити кожен елемент списку одновимірним списком з п’яти елементів:

a=[0] * 4

for i in range(4):

    a[i]=[0] * 5

 

Другий спосіб. Створити порожній список, потім чотири рази додати до нього новий елемент, який є списком з п’яти нулів:

a=[]

for i in range(4):

    a.append([0] * 5)

Проте ще простіше скористатися генератором: створити список з чотирьох елементів, кожен з яких буде списком з п’яти нулів:

a = [[0] * 5 for i in range(4)]

Заповнення двовимірного масиву розмірності 4х5 значеннями, заданими користувачем, можна виконати так:

a=[]

for i in range(4):

   b=[]

   for j in range(5):

      x=int(input(‘a[{},{}]=‘.format(i, j)))

      b.append(x)

   a.append(b)

Або, використовуючи генератори списків:

a = [[int(input(‘a[{},{}]=‘.format(i, j))) for j in range(5)] for i in range(4)]

 

Виведення вкладених списків

 

Щоб представити двовимірний масив у зручній формі (де елементи першого виміру окремі рядки, а елементи другого виміру в межах одного рядка розділяються пропусками), можна використати такий уривок програми.

for row in a:

   for elem in row:

      print(elem, end=‘ ‘)

   print()

 

Якщо спробувати відобразити вкладений список за допомогою функції print(), то елементи списку ми, звичайно ж, побачимо. Але відображатися вони будуть не у формі таблиці, як прийнято відображати матриці, а як вкладені списки.

 

 

Приклад. Дано список з 10 випадкових дійсних чисел. Підрахувати суму, добуток і середнє арифметичне елементів списку.

import random

v=[random.uniform(1, 100) for i in range(10)]

print(‘Елементи списку:’)

for i in v:

     print(i)

print(v)

s=sum(v)

d=1

for i in v:

   d=s*i 

a=s/len(v)

print(‘Сума = ‘,s)

print(‘Добуток = ‘,d)

print(‘Сер. арифм. = ‘,a)

 

Приклад. Дано списки A, B (кожний з 10 цілих випадкових чисел). Побудувати список C за правилом: ci= ai2 + bi2.

import random

a=[random.randint(1, 100) for i in range(10)] b=[random.randint(1, 100) for i in range(10)]

print(‘Елементи списку a: ‘, a)

print(‘Елементи списку b: ‘, b)

c=[]

for i in range(10):

c.append(a[i]**2+b[i]**2)

print(‘Елементи списку c: ‘, c)

 

Приклад. Дано список з 15 цілих випадкових чисел. Знайти максимальне значення елементу списку та підрахувати кількість елементів списку з таким значенням.

import random

a=[random.randint(1, 10) for i in range(15)]

print(‘Елементи списку a: ‘, a)

m=max(a)

c=a.count(m)

print(‘Максимальний елемент списку: ‘, m)

print(‘Кількість максимальних елементів: ‘, c)

 

Приклад. Дано цілочисельну матрицю випадкових цілих чисел розміром m´n (m і n задаються користувачем). Знайти міні­мальний елемент матриці та його індекси.

Розгляньмо декілька способів розв’язування цієї задачі. Проте всі вони матимуть однаковий початок, в якому задаватиметься розмірність матриці, генеруватиметься матриця і виводити­меться в «природній» формі.

import random

n=int(input(‘Введіть кількість рядків матриці: ‘)) m=int(input(‘Введіть кількість стовпців матриці: ‘))

 a=[]

for i in range(n):

   b=[]

    for j in range(m):

      x=random.randint(10,99)

      b.append(x)

    a.append(b)

print(‘Згенерована матриця:’)

for row in a:

    for elem in row:

    print(elem, end=‘ ‘)

print()

 

Спосіб. 1. Розв’язування методом перебору.

. . .

min_el=a[0][0]

min_i=0

min_j=0

for i in range(n):

   for j in range(m):

    if a[i][j]<min_el:

       min_el=a[i][j]

       min_i=i

       min_j=j

print(‘Мінімальний елемент: ‘,min_el)

print(‘Індекс мінімального елементу

        [{}, {}]’.format(min_i,min_j))

 

Спосіб. 2. Розв’язування з використанням методів списків.

. . .

min_col=list(map(min, a))

min_el=min(min_col)

min_i=min_col.index(min(min_col))

min_j=a[min_i].index(min_el)

print(‘Мінімальний елемент: ‘,min_el)

print(‘Індекс мінімального елементу

        [{}, {}]’.format(min_i,min_j))

Якщо ж матриця міститиме декілька рівних елементів, які і будуть мінімальними, то запропоновані способи не підходять.

 

Спосіб. 3. Розв’язування з використанням методів списків.

. . .

min_col=list(map(min, a))

min_el=min(min_col)

print(‘Мінімальний елемент: ‘,min_el)

for i in range(n):

   for j in range(m):

    if a[i][j]==min_el:

     print(‘Індекс мінімального елементу [{}, {}]’.format(i,j))

 

Приклад. Дано цілочисельну матрицю випадкових цілих чисел розміром 4´4. Написати програму для транспонування матриці (переставлення стовпчиків та рядків

import random

a = [[random.randint(10,99) for j in range(4)] for i in range(4)]

print(‘Згенерована матриця:’)

for row in a:

    for elem in row:

        print(elem, end=‘ ‘)

    print()

#Тут має міститися блок транспонування матриці print(‘Транспонована матриця:’)

for row in t:

   for elem in row:

       print(elem, end=‘ ‘)

   print()

 

Спосіб. 1. Транспонування вкладеними циклами:

t = []

for i in range(4):

   t_row = []

   for row in a:

      t_row.append(row[i])

   t.append(t_row)

 

Спосіб. 2. Згортання внутрішнього циклу в генератор списків:

t = []

for i in range(4):

      t.append([row[i] for row in a])

 

Спосіб. 3. Згортання зовнішнього циклу в генератор списків:

t=[[row[i] for row in a] for i in range(4)]

 

Завдання для самоперевірки

Завдання 1. Створити програму обробки одновимірного масиву.

1. Заповнити та вивести масив, елементи якого обчислюються за допомогою формули D[I]=tg(I+2)2-sin(i-/2).

2. Заповнити масив з двадцяти елементів таким чином 20, 19, …, 1.

3. Заповнити масив першими 10 членами арифметичної прогресії з відомим першим членом прогресії а та різницею р.

4. Елементи масиву обчислюються за формулою а[i]=sin(i)-cos(i). Заповнити та вивести масив з 15 елементів.

 

Завдання 2. Скласти програму знаходження деяких параметрів, які характеризують одновимірні масиви.

1. Визначити суму елементів, розташованих до мінімального елементу.

2. Визначити суму елементів, розташованих до першого елементу рівного нулю.

3. Визначити кількість елементів, розташованих після найменшого по модуля елементу.

4. Визначити максимальний елемент, розташований до першого від’ємного елементу.

 

Завдання 3.

1. Які підсумкові результати кожного кандидата? (утворити одновимірний масив із сум значень усіх стовпців таблиці).

2. Які номери населених пунктів, де кількість поданих голосів перевищила 150 (Підказка: утворити одновимірний масив із цих номерів)?

3. Хто з кандидатів набрав максимальну, а хто ‒ мінімальну кількість голосів у четвертому населеному пункті?

4. Яка кількість голосів була подана за першого і третього кандидатів у всіх населених пунктах?

 

Завдання 4.

1. Написати програму, яка обчислює суму елементів кожного рядка, менших за 10.

2. Написати програму, яка обчислює середнє арифметичне тих стовпців, які мають парні номера.

3. Дано двовимірний масив цілих чисел. У кожному стовпці знайти суму та кількість непарних чисел.

4. Дано двовимірний масив цілих чисел. У кожному рядку знайти кількість елементів рівних а.

 

 

Ø Список це впорядкований набір елементів. Для створення списку елементи беруть у квадратні дужки. Також можна використовувати функцію list().

Ø Елементи списку можуть бути різного типу.

Ø Визначити кількість елементів у списку можна за допомогою функції len().

Ø Для отримання доступу до елементу списку після імені списку у квадратних дужках указують індекс елементу. Індексація елементів починається з нуля. Для індексації елементів із кінця списку використовують від’ємні індекси.

Ø Для отримання зрізу (доступу до декількох елементів) у квадратних дужках після імені масиву вказуються через двокрапку два індекси, які визначають послідовність елементів зрізу.

Ø Значення елементів у списку можна змінювати. Елементи зі списку можна видаляти (наприклад, методами pop() і remove()), додавати до списку (наприклад, за допомогою методів append() і insert()), а також замінювати одну групу елементів на іншу (скажімо, через операцію присвоювання значення зрізу). Списки можна об’єднувати (метод extend()).

Ø Під час копіювання списків присвоювання, зазвичай, не використовується (оскільки при цьому копія списку не створюється, просто дві змінні будуть посилатися на один список). Поверхневе копіювання списків здійснюється через отримання зрізу або за допомогою методу copy(). Під час створення поверхневої копії для внутрішніх списків копії не створюються. Копіювання списків можна виконувати за допомогою функції deepcopy() (із модуля copy). В останньому випадку створюється повна копія списку (тобто створюються копії навіть для внутрішніх списків).

Ø Кортеж, як і список, є впорядкованим набором елементів. Багато в чому кортежі схожі на списки, але кортежі не можна змінювати.

 

Питання для перевірки засвоєних знань

1. Що таке список у Python?

2. Які типи даних можна зберігати у списку?

3. Як створити порожній список у Python?

4. Як додати елемент до списку?

5. Як видаляти елемент із списку у Python?

6. Як впорядковувати елементи у списку?

7. Як створити копію списку в Python?

8. Що таке доступ до елементів списку в Python?

9. Як використовувати індекси для доступу до елементів списку?

10. Як використовувати зрізи для витягування певних ділянок списку?

11. Що таке змінюваність (mutability) в контексті списків у Python?

12. Які методи змінюють список прямо в місці, а які повертають новий список?

13. Які об’єкти можна зберігати у списку, що має змінюваність?

14. Чому змінюваність списків корисна для програмування?

15. Як впливає змінюваність на передачу списків у функції?

16. Чому важливо розуміти концепцію змінюваності списків під час розробки програм мовою Python?

17. Які методи можна використовувати для додавання, видалення та зміни елементів списку?

18. Як використовувати методи для пошуку певних елементів у списку?

19. Які методи використовуються для сортування та зворотного впорядку­вання списку?

Попередня тема

На початок

Наступна тема