Списки в PYTHON.

Опубликовано kybik - вс, 11/26/2017 - 02:42

Списки дозволяють зберігати в одному місці взаємопов'язані дані, скільки б їх не було - кілька елементів або кілька мільйонів елементів. Робота зі списками відноситься до числа найбільш видатних можливостей Python, доступних для початківця програміста. Операції зі списками пов'язують воєдино багато важливих концепцій в програмуванні.

Що таке список?

Список - це набір елементів, які слідують в певному порядку. Ви можете створити список для зберігання букв алфавіту, цифр від 0 до 9 або імен всіх членів вашої родини. У список можна помістити будь-яку інформацію, причому дані в списку навіть не зобов'язані бути якось пов'язані один з одним. Так як список зазвичай містить більше одного елемента, рекомендується привласнювати списками імена у множині: letters, digits, names і т.д.
У мові Python список позначається квадратними дужками ( [ ] ), а окремі елементи списку розділяються комами. Простий приклад списку з назвами моделей велосипедів:

bicycles.py
bicycles = [ 'trek', 'cannondale', 'redline', 'specialized']
print (bicycles)

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

[ 'Trek', 'cannondale', 'redline', 'specialized']

Звичайно, вашим користувачам таке уявлення не підійде; розберемося, як звернутися до окремих елементів в списку.

Звернення до елементів списку.

Списки є впорядковані набори даних, тому для звернення до будь-якого елементу списку слід повідомити Python позицію (індекс) потрібного елемента. Щоб звернутися до елементу в списку, вкажіть ім'я списку, за яким слідує індекс елемента в квадратних дужках. Наприклад, назва першого велосипеда в списку bicycles виводиться наступним
чином:

bicycles = [ 'trek', 'cannondale', 'redline', 'specialized']
.1. print(bicycles[0])

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

trek

Саме такий результат повинні побачити користувачі - чистий, акуратно відформатований результат. Також можна використовувати строкові методи із будь-яким елементом списку. Наприклад, елемент 'trek' можна більш акуратно відформатувати за допомогою методу title():

bicycles = [ 'trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0].title())

Цей приклад видає такий же результат, як і попередній, тільки назва 'Trek' виводиться з великої літери. 

Індекси починаються з 0, а не з 1.

Python вважає, що перший елемент списку знаходиться в позиції 0, а не в позиції 1. Цей принцип зустрічається в більшості мов програмування і пояснюється особливостями низькорівневої реалізації операцій зі списками. Якщо ви отримуєте несподівані результати, визначте, чи не припустилися ви простої помилки «Зміщення на 1». Другому елементу списку відповідає індекс 1. У цій простій схемі індекс будь-якого елемента обчислюється зменшенням на 1 його позиції в списку. Наприклад, щоб звернутися до четвертого елементу списку, слід запросити елемент з індексом 3. У наступному прикладі виводяться назви велосипедів з індексами 1 і 3:

bicycles = [ 'trek', 'cannondale', 'redline', 'specialized']
print(bicycles[1])
print(bicycles[3])

При цьому виводиться другий і четвертий елементи списку: 

cannondale 
specialized

В Python також існує спеціальний синтаксис для звернення до останнього елементу списку. Якщо запитати елемент з індексом -1, Python завжди повертає
останній елемент в списку:

bicycles = [ 'trek', 'cannondale', 'redline', 'specialized']
print(bicycles[-1])

Фрагмент поверне значення 'specialized'. Цей синтаксис дуже корисний, тому що при роботі зі списками часто потрібно звернутися до останніх елементів, не знаючи точної кількості елементів в списку. Синтаксис також поширюється на інші негативні значення індексів. Індекс -2 повертає другий елемент від кінця списку, індекс -3 - третій елемент від кінця і т.д.. 

Використання окремих елементів зі списку.

Окремі значення зі списку використовуються так само, як і будь-які інші змінні. Наприклад, ви можете скористатися конкатенацією для побудови повідомлення, що містить значення зі списку. Спробуємо витягти назву першого велосипеда зі списку і скласти повідомлення, що включає це значення.

bicycles = [ 'trek', 'cannondale', 'redline', 'specialized']
.1. message = "My first bicycle was a" + bicycles[0].title() + "."
print (message)

У точці .1. програма будує повідомлення, що містить значення з bicycles[0], і зберігає його у змінній message. Так створюється просте речення зі використанням першого велосипеда зі списку:

My first bicycle was a Trek.

Зміна, додавання і видалення елементів.

Зазвичай ви будете створювати динамічні списки; це означає, що під час виконання програми в створеному вами списку будуть додаватися і видалятися елементи. Наприклад, ви можете створити гру, в якій гравець повинен стріляти по кораблях космічних загарбників. Вихідний набір кораблів зберігається в списку; кожен раз, коли ви збиваєте корабель, він видаляється зі списку. Кожен раз, коли на екрані з'являється новий ворог, він включається в список. Довжина списку кораблів буде зменшуватися і збільшуватися по ходу гри.

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

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

.1. motorcycles = [ 'honda', 'yamaha', 'suzuki']
print(motorcycles)
.2. motorcycles[0] = 'Ducati'
print(motorcycles)

У точці .1. визначається список, в якому перший елемент містить рядок 'honda'. У точці .2. значення першого елемента замінюється рядком 'ducati'. З наведеного видно, що перший елемент дійсно змінився, а інші елементи списку зберегли колишні значення:

[ 'Honda', 'yamaha', 'suzuki']
[ 'Ducati', 'yamaha', 'suzuki']

Змінити можна значення будь-якого елемента в списку, не тільки першого.

Додавання елементів до списку.

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

Приєднання елементів в кінець списку.

Найпростіший спосіб додавання нових елементів в список - приєднання елемента в кінець списку. Використовуючи список з попереднього прикладу, додамо новий
елемент 'ducati':

motorcycles = [ 'honda', 'yamaha', 'suzuki']
print(motorcycles)
.1. motorcycles.append( 'ducati')
print(motorcycles)

Метод append() в точці .1. приєднує рядок 'ducati' в кінець списку, інші елементи в списку при цьому залишаються незмінними:

[ 'honda', 'yamaha', 'suzuki']
[ 'honda', 'yamaha', 'suzuki', 'ducati']

Метод append() спрощує динамічну побудову списків. Наприклад, ви можете почати з порожнього списку і додавати в нього елементи серією команд append(). У наступному прикладі в порожній список додаються елементи 'honda', 'yamaha' і 'suzuki':

motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
print(motorcycles)

Отриманий список виглядає точно так само, як і списки з попередніх прикладів:

[ 'Honda', 'yamaha', 'suzuki']

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

Додавання елементів в список.

Метод insert() дозволяє додати новий елемент в довільну позицію списку. Для цього слід вказати індекс та значення нового елемента.

motorcycles = ['honda', 'yamaha', 'suzuki']
.1. motorcycles.insert(0, 'ducati')
print(motorcycles)

У цьому прикладі в точці .1. значення 'ducati' вставляється в початок списку. Метод insert() виділяє вільне місце в позиції 0 і зберігає в ньому значення 'ducati'. Всі інші значення списку при цьому зсуваються на одну позицію вправо:

['ducati', 'honda', 'yamaha', 'suzuki']

Видалення елементів зі списку.

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

Видалення елемента з використанням команди del.

Якщо вам відома позиція елемента, який повинен бути вилучений зі списку, скористайтеся командою del.

motorcycles = [ 'honda', 'yamaha', 'suzuki']
print(motorcycles)
.1. del motorcycles[0]
print(motorcycles)

У точці .1. виклик del видаляє перший елемент, 'honda', зі списку motorcycles:

[ 'honda', 'yamaha', 'suzuki']
[ 'yamaha', 'suzuki']

Команда del дозволяє видалити елемент з будь-якої позиції списку, якщо вам відомий його індекс. Наприклад, ось як зі списку видаляється другий елемент 'yamaha':

motorcycles = [ 'honda', 'yamaha', 'suzuki']
print(motorcycles)


del motorcycles[1]
print(motorcycles)

Другий елемент зник зі списку:

[ 'honda', 'yamaha', 'suzuki']
[ 'honda', 'suzuki']

В обох прикладах значення, видалене зі списку після використання команди del, стає недоступним.

Видалення елемента з використанням методу pop().

Іноді значення, що видаляється зі списку, має якось використовуватися. Припустимо, ви хочете отримати координати x і y щойно збитого корабля прибульців, щоб зобразити вибух в цій позиції. У веб-додатку користувач, видалений зі списку активних учасників, може бути доданий в список неактивних і т.д.
Метод pop() видаляє останній елемент зі списку, але дозволяє працювати з ним після видалення. Видалимо мотоцикл зі списку:

.1. motorcycles = [ 'honda', 'yamaha', 'suzuki']
print(motorcycles)
.2. popped_motorcycle = motorcycles.pop()
.3. print(motorcycles)
.4. print(popped_motorcycle)

Спочатку в точці .1. визначається і виводиться вміст списку motorcycles. У точці .2. значення витягується зі списку і зберігається в змінній з ім'ям popped_motorcycle. Вивід зміненого списку в точці .3. показує, що значення було видалено зі списку. Потім ми виводимо витягнуте значення в точці .4., демонструючи, що видалене зі списку значення залишається доступним в програмі.
З цього ми бачимо, що значення 'suzuki', видалене із списку, тепер зберігається в змінній popped_motorcycle:

[ 'honda', 'yamaha', 'suzuki']
[ 'honda', 'yamaha']
suzuki

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

motorcycles = [ 'honda', 'yamaha', 'suzuki']
last_owned = motorcycles.pop()
print( "The last motorcycle I owned was a " + last_owned.title() + ".")

Програма виводить просте повідомлення:

The last motorcycle I owned was a Suzuki.

Витяг елементів з довільної позиції списку.

Виклик pop() може використовуватися для видалення елемента в довільній позиції списку; для цього слід вказати індекс елемента, який необхідно видалити в круглих дужках.

motorcycles = [ 'honda', 'yamaha', 'suzuki']
.1. first_owned = motorcycles.pop(0)
.2. print( 'The first motorcycle I owned was a ' + first_owned.title() + '.' )

Спочатку перший елемент витягується зі списку в точці .1., а потім в точці .2. виводиться повідомлення про цей мотоцикл. Програма виводить просте повідомлення
про перший мотоциклі:

The first motorcycle I owned was a Honda.

Пам'ятайте, що після кожного виклику pop() елемент, з яким ви працюєте, вже не знаходиться у списку. Якщо ви не впевнені в тому, який із двох способів вибрати - команду del або метод pop(), - то просте правило допоможе вам визначитися. Якщо ви збираєтеся просто видалити елемент зі списку, ніяк не використовуючи його, вибирайте команду del; якщо ж ви маєте намір використовувати елемент після видалення зі списку, вибирайте метод pop().

Видалення елементів за значенням.

Іноді позиція елемента, який необхідно видалити - невідома. Якщо ви знаєте тільки значення елемента, використовуйте метод remove().
Припустимо, зі списку потрібно видалити значення 'ducati':

motorcycles = [ 'honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)
.1. motorcycles.remove( 'ducati')
print(motorcycles)

Код в точці .1. наказує Python визначити, в якій позиції списку знаходиться значення 'ducati', і видалити цей елемент:

[ 'honda', 'yamaha', 'suzuki', 'ducati']
[ 'honda', 'yamaha', 'suzuki']

Метод remove() також може використовуватися для роботи зі значенням, яке видаляється зі списку. Наступна програма видаляє значення 'ducati' і виводить причину видалення:

.1. motorcycles = [ 'honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)
.2. too_expensive = 'ducati'
.3. motorcycles.remove(too_expensive)
print(motorcycles)
.4. print( "\nA " + too_expensive.title() + " is too expensive for me.")

Після визначення списку в точці .1. значення 'ducati' зберігається в змінній з ім'ям too_expensive в точці .2.. Потім ця змінна повідомляє Python, яке значення має бути видалено зі списку .3.. У точці .4. значення 'ducati' було видалено зі списку, але продовжує зберігатися у змінній too_expensive, що дозволяє вивести повідомлення з причиною видалення 'ducati' зі списку мотоциклів:

[ 'honda', 'yamaha', 'suzuki', 'ducati']
[ 'honda', 'yamaha', 'suzuki']
A Ducati is too expensive for me.

ПРИМІТКА
Метод remove() видаляє тільки перше входження заданого значення. Якщо існує ймовірність того, що значення зустрічається в списку більше одного разу, використовуйте цикл для визначення того, чи були видалені всі входження даного значення. Про те, як це зробити - ми розглянемо вивчаючи цикл While.