|
|
Програмування мовою Python: основи та практика Електронний посібник |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ТЕМА 7.1. СПИСКИ |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ба більше, елементами списку так само
можуть бути списки. Тобто за допомогою списків ми можемо створювати вкладену
структуру практично будь-якої (в розумних межах, зрозуміло) складності. Список є змінюваним, тобто може
змінюватися після створення. Відображається як послідовність елементів,
розділених комами та укладених у квадратні дужки:[1,
2, 3, ‘Hello’]. >>>
a=[] >>>
a=list()
>>>
a=[1, 2, 3, 4] >>>
b=[‘Hello’, 2, True]
>>> 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]
>>>
a=[0]*5 >>> print(a) [0, 0, 0, 0, 0]
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.uniform(A, B). Повертає псевдовипадкове дійсне число, що належить відрізку [A, B] або [B, A]. random.randint(A, B). Повертає псевдовипадкове ціле число, що належить відрізку [A, B]. random.choice(sequence). Повертає випадковий елемент з послідовності sequence (рядка, списку, кортежу тощо).
random.shuffle(sequence, [rand]). Перемішує та повертає елементи послідовності sequence (рядка, списку, кортежу
тощо). Оскільки змінюється сама послідовність, то функція не
застосовна для незмінних об’єктів. Необов’язковий
аргумент rand
є функцією без аргументів,
що повертає випадкове значення з діапазону [0.0, 1.0), стандартно використовуватиметься
random.random.
random.sample(population, k). Повертає список з псевдовипадкових k елементів послідовності population (рядка, списку, кортежу тощо). k
не може бути більше за довжину послідовності population.
random.getrandbits(N). Повертає псевдовипадкове ціле число, бітовий запис якого не перевищує N біт.
random.seed(X=None, version=2). Налаштування стану
генератора випадкових чисел на нову послідовність
генерації. Для однакового значення
параметра X генеруються однакові
послідовності. Як значення параметра X
початково використовується системний час.
random.getstate(). Повертає об’єкт, що фіксує поточний внутрішній стан генератора. Цей
об’єкт може бути переданий в setstate() для відновлення стану. random.setstate(state). Відновлює внутрішній стан генератора. Параметр state має
бути отриманий функцією getstate().
random.triangular(low, high, mode) – трикутний
розподіл. Повертає псевдовипадкове дійсне число з відрізка [low, high]. Параметр mode
задає режим розподілу
low ≤ mode ≤ 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 ‒ параметр форми.
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
Генератори списків дають змогу зручно
створювати список, де кожен елемент генерується на основі певної операції, що
застосовується до елементів іншого списку або послідовності. Також можна
створювати список, вибравши лише ті елементи, які відповідають певній умові. Генератор списку включає квадратні
дужки, які містять вираз для формування кожного елементу списку, та цикл for для ітерації по елементах іншої «базової» послідовності. Також можна застосовувати
умову if для обмеження елементів, які додаються до списку. Створення списку цілих
чисел від 0 до 10:
Створення списку, який
містить 5 нулів:
Створення списку з
елементів, які є квадратами чисел від 1 до 4:
Створення списку цілих
непарних чисел, менших за 10:
Створення списку з 10 елементів,
що заповнений випадковими числами від 1 до 9:
Створення списку, елементами
якого будуть пари чисел, які є елементами двох інших списків:
Доступ до елементів списку відбувається за їх індексами.
Як і в багатьох інших мовах, нумерація елементів починається з нуля. Для того
щоб звернутися до елементу списку, необхідно вказати ім’я змінної списку та в
квадратних дужках індекс необхідного елементу (ім’я_списку[індекс]).
За спроби доступу до неіснуючого індексу виникає виняток IndexError.
Якщо ж розглянути всі індекси для
списку [1, 3, 5, 7, 9], отримаємо:
Можна перевірити приналежність
деякого елементу до списку, використовуючи
оператор in (значення in ім’я_списку).
Для протилежної перевірки, що елемент
не належить списку, може бути використаний
оператор not in.
Раніше зазначалося, що, використовуючи цикл for, можна перебрати всі елементи послідовності, а отже, і списку. Тому команда
виведення елементів списку окремими рядками матиме вигляд:
А команда виведення
елементів списку через пропуск:
Часто потрібно отримати не один
елемент списку за його індексом, а декілька елементів за певним правилом,
наприклад, перші п’ять елементів або кожен другий. У таких випадках набагато зручніше скористатися зрізом (slice,
slicing) замість
перебору в циклі. Зріз дає змогу отримати певну
підмножину елементів зі списку, і сам зріз є списком. Отримання одного
елементу списку можна розглядати як найпростіший випадок використання зрізу. Для списку item
береться зріз від індексу start, до stop (не включаючи
його), з кроком step. Також під час запису зрізу
деякі, а можливо і всі параметри можуть бути опущені (знаки двокрапки в
записі все рівно залишаються). У разі відсутності деяких параметрів їх значення встановлюється як усталено, а саме: start = 0, stop = кількості елементів списку, step = 1.
Якщо опустити другий параметр (залишивши
двокрапку), то зріз береться до кінця рядка. Наприклад, щоб отримати зріз без
першого елементу, можна записати a[1:].
Якщо ж опустити перший параметр, то отримаємо зріз, який містить вказану
кількість елементів, що йдуть на початку списку.
У разі задання значення третього
параметра, який дорівнює 2, у зріз потрапить кожний другий елемент списку.
У разі, якщо параметри start і stop мають від’ємні значення, то нумерація відбуватиметься з кінця (кількість
символів рядка + від’ємний індекс). Наприклад, a[-2:] – це список з останніх двох елементів.
В останньому прикладі
було отримано порожній список, оскільки start < stop, а step від’ємний. Те саме відбудеться, якщо діапазон індексів
виявиться за межами списку.
Оскільки списки можна змінювати,
можна модифікувати та вилучати окремі їхні елементи без застосування
спеціальних методів, які будуть представлені нижче.
Оскільки списки дають змогу змінювати
їхні елементи, можна виконати заміну одного чи кількох елементів у списку.
Для цього потрібно звернутися до елементу списку за його індексом,
використовуючи квадратні дужки, і присвоїти нове значення цьому елементу: (ім’я_списку[індекс]=нове_значення).
Змінювати також можна не один
елемент, а відразу декілька, використовуючи зрізи.
Проте варто зауважити, що під час
спроби додати список елементів не зрізу, а одному елементу, отримаємо заміну
цього елементу на окремий список.
Для вилучення елементу списку за його індексом можна скористатися командою del (del ім’я_списку[індекс]).
Також команда del може бути використана для вилучення зрізу із списку чи
очищення всього списку
Змінна, яка призначена
для зберігання списку, посилається на область у пам’яті, яка містить
посилання на об’єкти (елементи) цього списку. На відміну від числових типів
даних, списки є змінюваними, тому їхній вміст можна змінювати, розширювати
або скорочувати.
Коли ми присвоюємо один список іншій
змінній, зазвичай, через звичайне присвоєння, це призводить до того, що
обидва списки насправді посилаються на один і той самий об’єкт у пам’яті. І
якщо будь-який з цих списків зміниться, це вплине на обидва, оскільки вони
вказують на одну і ту саму область пам’яті.
Тому для створення нового списку, який
буде копією цього, необхідно
скористатися зрізом або функцією list().
list.append(x). Додає елемент x
в кінець списку list. Аналогічно командам a[len(a):]=[x].
list.extend(iterable). Розширює існуючий список list через додавання до нього всіх елементів з iterable. Аналогічно командам a[len(a):]=iterable.
list.insert(n, x). Вставляє в
список list елемент x в позицію n (індекс елементу, після якого буде
вставлений елемент).
list.remove(x). Вилучає перше входження елементу x зі списку list.
list.pop([n]). Вилучає з списку list елемент з позиції n та повертає його як результат виконання функції. Якщо використовувати
метод без параметру, то буде вилучений останній елемент списку.
list.clear(). Очищує список list (вилучає всі елементи зі списку). Аналогічно до del a[:].
list.index(x[, start[, end]]). Повертає індекс першого входження елементу x в зрізі list[start: end] (необов’язкові параметри start та end інтерпретуються як нотації зрізу). Значення, що повертається,
є індексом списку list.
Якщо елементу в списку не знайдено, виникає виняток ValueError.
list.count(x). Повертає кількість
входжень елементу x в список.
list.sort(key=None, reverse=False). Відсортовує елементи списку (аргументи методу
можуть бути використані для налаштування сортування). Як усталено сортування
відбувається за зростанням. Для сортування в зворотному
порядку використовуйте параметр reverse
= True. Як
результат сортування змінюється сам список.
list.reverse(). Змінює
порядок розташування елементів у списку на зворотний. Змінюється сам список.
list.copy(). Повертає
копію списку. Аналогічно a[:].
Списки можна
порівнювати між собою, але це
відбувається поелементно.
Щоб порівняти два списки, важливо, щоб їх відповідні елементи мали однаковий
тип або методи порівняння. Порівняння відбувається за лексикографічним
порядком, починаючи з перших елементів. Якщо вони різні, вони і визначають
результат порівняння. Якщо елементи рівні, порівнюються наступні. Якщо обидва
порівнювані елементи є списками, порівняння відбувається
рекурсивно. Якщо всі елементи списків рівні, то списки вважаються однаковими.
Якщо один список збігається з початком іншого, то менший вважається тим, що
коротший.
Часто в задачах доводиться зберігати прямокутні
таблиці з даними. Такі таблиці називають матрицями або двовимірними масивами.
За аналогією з одновимірними
масивами, які в мові Python подаються списками, двовимірний
масив можна подати у формі списку (двовимірного
списку), кожен елемент якого так само є списком.
До елементів такого списку можна звертатися
так само, як і до елементів звичайного списку, лише враховуючи, що перший
вимір (рядки) також є списком.
Можна застосовувати аналогію для
пояснення тривимірних списків і таких, що мають нескінченну вкладеність. У 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)]
Щоб представити двовимірний масив у
зручній формі (де елементи першого виміру ‒ окремі
рядки, а елементи другого виміру в межах одного рядка розділяються
пропусками), можна використати такий уривок програми.
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)
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)
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)
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()
. . . 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))
. . . 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)) Якщо ж матриця міститиме декілька рівних елементів, які і будуть
мінімальними, то запропоновані способи не підходять.
. . . 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))
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()
t = [] for i in range(4): t_row = [] for row in a: t_row.append(row[i]) t.append(t_row)
t = [] for i in range(4): t.append([row[i] for row in a])
t=[[row[i] for row in a] for i in
range(4)] Завдання для самоперевірки
Ø Список ‒ це впорядкований набір елементів. Для створення списку елементи беруть у
квадратні дужки. Також можна
використовувати функцію list(). Ø Елементи списку можуть бути різного типу. Ø Визначити кількість елементів у списку можна
за допомогою функції len(). Ø Для отримання доступу до елементу списку після імені списку у
квадратних дужках указують індекс елементу. Індексація елементів починається
з нуля. Для індексації елементів із кінця списку використовують від’ємні індекси. Ø Для отримання зрізу (доступу до декількох елементів) у квадратних
дужках після імені масиву вказуються через двокрапку два індекси, які
визначають послідовність елементів зрізу. Ø Значення елементів у списку можна змінювати. Елементи зі списку можна видаляти (наприклад, методами pop() і remove()), додавати до списку (наприклад, за допомогою методів append() і insert()),
а також замінювати одну
групу елементів на іншу (скажімо, через операцію присвоювання значення зрізу). Списки можна об’єднувати (метод extend()). Ø Під час копіювання списків присвоювання, зазвичай, не
використовується (оскільки при цьому копія списку не створюється, просто дві змінні будуть
посилатися на один список). Поверхневе копіювання списків здійснюється через
отримання зрізу або за допомогою
методу copy(). Під
час створення поверхневої копії для внутрішніх списків копії не створюються.
Копіювання списків можна виконувати
за допомогою функції deepcopy() (із модуля copy).
В останньому випадку створюється повна копія списку (тобто створюються копії
навіть для внутрішніх списків). Ø Кортеж, як і список, є впорядкованим набором елементів. Багато в чому
кортежі схожі на списки, але кортежі не можна змінювати.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||