Списки

 

Списки

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

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

list = []
print(list)

Запустивши код, бачимо (відео 1):

Відео 1 

Ми створили список, але він пустий. Давайте швидше його наповнювати даними. 

А допоможе в цьому метод append(), всередину якого ми маємо передати дані, які хочемо додати до списку. Додамо число 3:

list = []
list.append(3)
print(list)

Запустимо код (відео 2):

Відео 2

Тепер у нашому списку є перші дані. Давайте ще додамо змінну name, а їй присвоїмо рядок "Good Day":

list = []
name = "Good Day"
list.append(3)
list.append(name)
print(list)

Запустимо код (відео 3):

Відео 3

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

Важливо! Якщо далі переприсвоїти змінну name, то всередині списку нічого не зміниться.

Так само як і з рядками, можна дізнатися довжину списку з допомогою функції len():

list = []
name = "Good Day"
list.append(3)
list.append(name)
print(len(list))

Отримаємо (відео 4):

Відео 4

Але, вставити елементи можна й у певне місце списку. Допоможе в цьому метод insert(). Водночас першим аргументом передаємо індекс, на який має потрапити елемент, другим — сам елемент:

list = []
name = "Good Day"
list.append(3)
list.append(name)
list.insert(1, "Hi")
print(list)

Маємо (відео 5):

Відео 5

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

list = []
name = "Good Day"
list.append(3)
list.append(name)
list.insert(1, "Hi")
list.reverse()
print(list)

Запустивши код, бачимо (відео 6):

Відео 6

Якщо нам знадобиться конкретний елемент списку, то ми можемо його одержати з допомогою індексації. Вона повністю аналогічна до індексації рядків, тому немає сенсу на ній зупинятись. Але, якщо елементом списку є рядок або інший список, можна провести повторну індексацію. Отже, якщо нам потрібно вивести слово «Good» з нашого списку, достатньо прописати:

list = []
name = "Good Day"
list.append(3)
list.append(name)
list.insert(1, "Hi")
list.reverse()
print(list[0][:4])

Запустивши код, отримуємо те, що й хотіли (відео 7):

Відео 7

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

Але рахувати індекси не завжди зручно, тому можна скористатися методом index() й отримати номер елементу:

list = []
name = "Good Day"
list.append(3)
list.append(name)
list.insert(1, "Hi")
list.reverse()
print("Index 3 -", list.index(3))

Результат (відео 8):

Відео 8

Оскільки ми додавали елементи списку, то й видаляти їх теж можна. У цьому допомагають два методи:

  • pop() — вилучає останній елемент списку, але всередину нього можна передати номер елементу, який необхідно вилучити, і тоді він вилучить саме його.
  • remove() — вилучає конкретний елемент зі списку, тобто необхідно вказати не індекс, а сам елемент. Якщо однакових елементів декілька, то буде вилучено лише перший із них.

Маємо:

list = []
name = "Good Day"
list.append(3)
list.append(name)
list.insert(1, "Hi")
list.reverse()
list.pop(1)
list.remove("Good Day")
print(list)

Результат (відео 9):

Відео 9

У нас знову лишився один елемент. Але його також можна змінити, викликавши його й надавши нового значення. Замінимо трійку на число 100. Для цього перед функцією print() додамо:

list[0] = 100

Отримаємо (відео 10):

Відео 10

Ми повністю змінили наш список. А тому, видалимо увесь цей код, та створимо два нових списки:

list_1 = [1,2,3]
list_2 = [4,5,6]

Списки, як і рядки, можна додавати. Маємо:

list_1 = [1,2,3]
list_2 = [4,5,6]
list_1 = list_1+list_2
print(list_1)

Результат (відео 11):

Відео 11

Але давайте докладніше розглянемо, що саме тут відбулося. У цьому рядку, ми переприсвоїли значення list_1. У якості нового значення став результат додавання двох списків. Оскільки подібні операції дуже розповсюджені, то в Python є еквівалентний, але простіший синтаксис. Можна прописати (відео 12):

Відео 12

Але не обов'язково додавати списки через переприсвоювання. З допомогою методу extend() можна до одного списку додати елементи іншого:

list_1 = [1,2,3]
list_2 = [4,5,6]
list_1.extend(list_2)
print(list_1)

Запустивши код, бачимо (відео 13):

Відео 13

О ні! Хтось перемішав перший список і тепер він виглядає ось так:

list_1 = [3,1,2]

Але не біда, скористаємось методом sort(), який сортує елементи списку за збільшенням. Якщо ж необхідно сортувати в порядку спадання, необхідно як аргумент вказати «reverse=True»:

list_1 = [3,1,2]
list_2 = [4,5,6]
list_1.sort()
print(list_1)

Маємо (відео 14):

Відео 14

Python також дає змогу виявити найбільший і найменший елементи списку, а також його суму, та водночас важливо, щоб усі елементи були числами. Для цього використовуються методи max(), min() і sum() відповідно:

list_1 = [3,1,2]
list_2 = [4,5,6]
list_1.sort()
print(max(list_1))
print(min(list_2))
print(sum(list_2))

Результат (відео 15):

Відео 15

Коли список дуже великий, іноді стає питання знайти в ньому кількість певного елемента. Тоді використовується метод count(). Маємо (відео 16):

Відео 16

Розробка гри «Війна нескінченності»

Уяви себе командиром супергероїв (Рис 1). 

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

Q0g2dW4bfGTHbH_skS61B7TbbCQ3i-L8
Малюнок 1

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

Але нам, як розробникам, спершу необхідно вигадати ці проблеми. Для цього створимо список із назвою problem_list, куди й запишемо їх:

problem_list = ["Living Giant Tree", "Alien Flying Saucer", "Monster Spirit from the Parallel Universe", "Evil Artificial Intelligence", "Parasites That Capture the Brain", "Mutant Centipede", "Mad Godzilla", "Black Dragon", "Titanium"]

Отже, тепер у нас є список лих, з якими зіткнуться супергерої. Щоби гра була цікавою, необхідно щоби проблема була випадковою. У цьому нам допоможе модуль random. Цей модуль містить у собі багато функцій, які генерують випадковості. Скористаємось функцією randint(), що повертає випадкове число з діапазону, заданого двома аргументами, перший з яких вказує на мінімальне значення, другий — на максимальне. Очевидно, що діапазон значень для нашого випадку — це довжина списку проблем. Оскільки індекси починаються з нуля, то мінімальним значенням буде нуль, а максимальним — на одиницю менше за довжину списку. Створимо змінну problem, якій буде присвоюватися проблема. А отримаємо її, індексуючи список проблем, де індексом буде вищеописана функція randint(). Отже, для того, щоби герої стикалися з різними проблемами, запишемо:

from random import randint
problem_list = ["Living Giant Tree", "Alien Flying Saucer", "Monster Spirit from the Parallel Universe", "Evil Artificial Intelligence", "Parasites That Capture the Brain", "Mutant Centipede", "Mad Godzilla", "Black Dragon", "Titanium"]
problem = problem_list[randint(0, len(problem_list)-1)]
print("The threat we faced -", problem)

Запустимо код декілька разів, щоби впевнитись, що все працює (відео 17):

Відео 17

Залишилося створити список, у який будуть поміщені імена супергероїв. 

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

Готовий код гри:

from random import randint
problem_list = ["Living Giant Tree", "Alien Flying Saucer", "Monster Spirit from the Parallel Universe", "Evil Artificial Intelligence", "Parasites That Capture the Brain", "Mutant Centipede", "Mad Godzilla", "Black Dragon", "Titanium"]
problem = problem_list[randint(0, len(problem_list)-1)]
print("The threat we faced -", problem)
list_of_heroes =[input(), input(), input()]
print("This Superheroes", list_of_heroes, "went on a mission")

Запустимо його та поглянемо на роботу гри (відео 18):

Відео 18

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