Списки

Списки

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

Раніше ми стикалися з завданням обробки елементів послідовності, наприклад, обчислюючи найбільший елемент послідовності. Але при цьому ми не зберігали всю послідовність в пам'яті комп'ютера, однак, у багатьох задачах потрібно саме зберігати всю послідовність, наприклад, якби нам було потрібно вивести всі елементи послідовності в порядку зростання ( "впорядкувати послідовність").

Для зберігання таких даних можна використовувати структуру даних, звану в Пітоні список (в більшості ж мов програмування використовується інший термін "масив"). Список являє собою послідовність елементів, пронумерованих від 0, як символи в рядку. Список можна задати перерахуванням елементів списку в квадратних дужках, наприклад, список можна задати так:

Primes = [2, 3, 5, 7, 11, 13]
Rainbow = [ 'Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
У списку Primes - 6 елементів, а саме,
Primes [0] == 2,
Primes [1] == 3,
Primes [2] == 5,
Primes [3] == 7,
Primes [4] == 11,
Primes [5] == 13.
Список Rainbow складається з 7 елементів, кожен з яких є рядком.

Також як і символи рядка, елементи списку можна індексувати негативними числами з кінця, наприклад,
Primes [-1] == 13,
Primes [-6] == 2.

Довжину списку, тобто кількість елементів в ньому, можна дізнатися за допомогою функції len, наприклад, len (A) == 6.

Розглянемо кілька способів створення і зчитування списків. Перш за все можна створити порожній список (який не містить елементів, довжини 0), в кінець списку можна додавати елементи за допомогою методу append. Наприклад, якщо програма отримує на вхід кількість елементів у списку n, а потім n елементів списку по одному в окремому рядку, то організувати зчитування списку можна так:

A = []
for i in range (int (input ())):
    A.append (int (input ()))
У цьому прикладі створюється порожній список, далі зчитується кількість елементів у списку, потім по одному зчитуються елементи списку і додаються в його кінець.

Для списків цілком визначені наступні операції: конкатенація списків (додавання одного списку в кінець іншого) і повторення списків (множення списку на число). наприклад:

A = [1, 2, 3]
B = [4, 5]
C = A + B
D = B * 3
В результаті список C буде дорівнює [1, 2, 3, 4, 5], а список D буде дорівнює [4, 5, 4, 5, 4, 5]. Це дозволяє по-іншому організувати процес зчитування списків: спочатку вважати розмір списку і створити список з потрібного числа елементів, потім організувати цикл по змінній i починаючи з числа 0 і всередині циклу зчитується i-й елемент списку:

A = [0] * int (input ())
for i in range (len (A)):
    A [i] = int (input ())
Вивести елементи списку A можна однією інструкцією print (A), при цьому будуть виведені квадратні дужки навколо елементів списку і коми між елементами списку. Такий висновок незручний, частіше потрібно просто вивести всі елементи списку в один рядок або по одному елементу в рядку. Наведемо два приклади, також відрізняються організацією циклу:

for i in range (len (A)):
    print (A [i])
Тут в циклі змінюється індекс елемента i, потім виводиться елемент списку з індексом i.

for elem in A:
    print (elem, end = '')
У цьому прикладі елементи списку виводяться в один рядок, розділені пропуском, при цьому в циклі змінюється не індекс елемента списку, а саме значення змінної (наприклад, в циклі for elem in [ 'red', 'green', 'blue'] змінна elem буде послідовно приймати значення 'red', 'green', 'blue'.
-------------------------------------------------------------------------------------------------------------------
Методи split і join

Елементи списку можуть вводитися по одному в рядку, в цьому випадку рядок можна вважати функцією input (). Після цього можна використовувати метод рядки split, який повертає список рядків, розрізавши вихідну рядок на частини по прогалин. приклад:

A = input (). Split ()
Якщо при запуску цієї програми ввести рядок 1 2 3, то список A буде дорівнює [ '1', '2', '3']. Зверніть увагу, що список буде складатися з рядків, а не з чисел. Якщо хочеться отримати список саме з чисел, то можна потім елементи списку по одному перетворити в числа:

for i in range (len (A)):
    A [i] = int (A [i])
Використовуючи функції мови map і list те ж саме можна зробити в один рядок:


A = list (map (int, input (). Split ()))
Пояснень, як працює цей код, поки не буде. Якщо потрібно вважати список дійсних чисел, то потрібно замінити тип int на тип float.

У методу split є необов'язковий параметр, який визначає, який рядок буде використовуватися як роздільник між елементами списку. Наприклад, метод split ( '.') Поверне список, отриманий розрізанням вихідного рядка по символам '.'.

Використовуючи "зворотні" методи можна вивести список за допомогою однорядковою команди. Для цього використовується метод рядки join. У цього методу один параметр: список рядків. В результаті виходить рядок, отримана з'єднанням елементів списку (які передані в якості параметра) в один рядок, при цьому між елементами списку вставляється роздільник, рівний тому рядку, до якої застосовується метод. наприклад програма

A = [ 'red', 'green', 'blue']
print ( '' .join (A))
print ( ''. join (A))
print ( '***'. join (A))
виведе рядки 'red green blue', redgreenblue і red *** green *** blue.

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

print ( '' .join (map (str, A)))
-------------------------------------------------------------------------------------------------------------------
Генератори списків

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

A = [0] * n
Для створення списків, заповнених за складнішими формулами можна використовувати генератори: вирази, що дозволяють заповнити список деякою формулою. Загальний вигляд генератора наступний:

[Вираз for змінна in список]
де змінна - ідентифікатор деякої змінної, список - список значень, який приймає дана змінна (як правило, отриманий за допомогою функції range), вираз - деякий вираз, яким будуть заповнені елементи списку, як правило, залежить від використаної в генераторі змінної.

Ось кілька прикладів використання генераторів.

Створити список, що складається з n нулів можна і за допомогою генератора:

A = [0 for i in range (n)]
Створити список, заповнений квадратами цілих чисел можна так:

A = [i ** 2 for i in range (n)]
Якщо потрібно заповнити список квадратами чисел від 1 до n, то можна змінити параметри функції range на range (1, n + 1):

A = [i ** 2 for i in range (1, n + 1)]
Ось так можна отримати список, заповнений випадковими числами від 1 до 9 (використовуючи функцію randint з модуля random):

A = [randint (1, 9) for i in range (n)]
А в цьому прикладі список буде складатися з рядків, лічених зі стандартного вводу: спочатку потрібно ввести число елементів списку (це значення буде використано як аргумент функції range), потім - задану кількість рядків:

A = [input () for i in range (int (input ()))]
----------------------------------------------------------------------------------------------------------------
Зрізи

Із списками, так же як із рядками, можна робити зрізи. А саме:

A [i: j] відрізати від j-i елементів А [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, то елементи будуть введені в протиположному порядку.

Кожне із чисел і або j може бути відсутній, що означає «початок рядка» або «кінець рядка»

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


A = [1, 2, 3, 4, 5]
A [2: 4] = [7, 8, 9]
Напівчислюється список, в якому замість двох елементів срібла A [2: 4] введено новий список, який вже є з трьох елементів. Тепер список перерахований [1, 2, 7, 8, 9, 5].

A = [1, 2, 3, 4, 5, 6, 7]
A [:: - 2] = [10, 20, 30, 40]
Получітся список [40, 2, 30, 4, 20, 6, 10]. Здесь A [:: - 2] - це список з елементів A [-1], A [-3], A [-5], A-7, які присвоюють значення 10, 20, 30, 40 відповідно.

Якщо ви не перебуваєте в постійному серезі (то є срібло з шагом k, відмінне від 1), визначте нове значення, що має кількість елементів у старі та новій срізці, обов'язково довго співпадає, в суперечливості, якщо вказано помилку ValueError.

Поверніть увагу, A [i] - це елемент списку, а не зріз!

Комментариев нет:

Отправить комментарий