Масив list - це змінювана колекція елементів, що йдуть у послідовності.
Як і більшість колекцій (див. вбудовані tuple, dict та set), масиви можуть містити посилання на будь-який (або кілька) тип(ів) даних, зокрема на інші масиви.
Масиви можна копіювати повністю або частково за допомогою зрізів або через <list>.copy().
Як і в будь-якій послідовності, до елементів у lists звертаються за номером 0-based index зліва або за номером -1-based index справа.
Масиви підтримують як загальні, так і змінювані операції послідовностей, як-от min(<list>)/max(<list>), <list>.index(), <list>.append() та <list>.reverse().
Елементи всередині list можна перебирати за допомогою конструкції for item in <list>.
Конструкцію for index, item in enumerate(<list>) можна використати, коли потрібні і індекс елемента, і значення елемента.
Python також надає багато корисних методів масиву для роботи з масивами.
Далі розглянемо добірку з цих list methods.
Зауважте: коли ми працюємо з list за допомогою list-method, ми змінюємо сам масив, тобто той обʼєкт, який було передано.
Якщо ми не хочемо змінювати початковий list, потрібно принаймні зробити його shallow copy за допомогою зрізу або <list>.copy().
Щоб додати елемент у кінець, тобто в «правий бік» наявного масиву, скористаймося <list>.append(<item>):
>>> numbers = [1, 2, 3]
>>> numbers.append(9)
>>> numbers
[1, 2, 3, 9]
Замість додавання в кінець, <list>.insert() дає змогу додати елемент за конкретним індексом у масиві.
Він приймає 2 параметри:
<index>, за яким ми хочемо вставити елемент.<item>, який треба вставити.Зауваження: якщо вказаний index дорівнює 0, елемент буде додано на початок list, тобто в його «лівий бік».
Якщо вказаний index більший за останній index у list, елемент буде додано в саму кінцеву позицію, що рівнозначно використанню <list>.append(<item>).
>>> numbers = [1, 2, 3]
>>> numbers.insert(0, -2)
>>> numbers
[-2, 1, 2, 3]
>>> numbers.insert(1, 0)
>>> numbers
[-2, 0, 1, 2, 3]
<list>.extend(<item>) можна використати, щоб поєднати наявний масив з елементами іншого ітерованого обʼєкта (наприклад, set, tuple, str або list).
Ітерований обʼєкт розпаковується, і його елементи додаються по порядку (якби ми в цьому випадку використали <list>.append(<item>), весь ітерований обʼєкт додався б як один елемент.).
>>> numbers = [1, 2, 3]
>>> other_numbers = [5, 6, 7]
>>> numbers.extend(other_numbers)
>>> numbers
[1, 2, 3, 5, 6, 7]
>>> numbers.extend([8, 9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9]
>>> numbers.append([8,9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9, [8, 9]]
Щоб видалити елемент з масиву, скористаймося <list>.remove(<item>), передавши елемент для видалення як аргумент.
<list>.remove(<item>) викличе ValueError, якщо такого елемента немає в list.
>>> numbers = [1, 2, 3]
>>> numbers.remove(2)
>>> numbers
[1, 3]
# Trying to remove a value that is not in the list throws a ValueError
>>> numbers.remove(0)
ValueError: list.remove(x): x not in list
Або ж метод <list>.pop(<index>) одночасно видалить елемент і поверне (return) його для подальшого використання.
<list>.pop(<index>) приймає один необовʼязковий параметр: index елемента, який треба видалити й повернути.
Якщо (необовʼязковий) аргумент index не вказано, буде видалено й повернено останній елемент list.
Якщо вказаний index більший за index останнього елемента, виникає IndexError.
>>> numbers = [1, 2, 3]
>>> numbers.pop(0)
1
>>> numbers
[2, 3]
>>> numbers.pop()
3
>>> numbers
[2]
>>> numbers.pop(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
Усі елементи можна видалити з list за допомогою list.clear(). Він не приймає жодних параметрів.
>>> numbers = [1, 2, 3]
>>> numbers.clear()
>>> numbers
[]
Метод <list>.reverse() оберне порядок елементів на місці.
>>> numbers = [1, 2, 3]
>>> numbers.reverse()
>>> numbers
[3, 2, 1]
Масив можна перевпорядкувати на місці за допомогою <list>.sort().
Типово елементи сортуються за зростанням зліва.
Документація Python пропонує додаткові поради та прийоми сортування.
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
# The default sort order is *ascending*.
>>> names.sort()
>>> names
["Bruce", "Natasha", "Thor", "Tony"]
Якщо потрібен порядок за спаданням, передамо аргумент reverse=True:
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> names.sort(reverse=True)
>>> names
["Tony", "Thor", "Natasha", "Bruce"]
Якщо змінювати початковий масив небажано, можна скористатися вбудованою функцією sorted(<iterable>), щоб отримати відсортовану копію.
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> sorted(names)
['Bruce', 'Natasha', 'Thor', 'Tony']
Кількість входжень елемента в масив можна обчислити за допомогою list.count(<item>).
Він приймає як аргумент item, який треба порахувати, і повертає загальну кількість разів, коли цей елемент трапляється в list.
>>> items = [1, 4, 7, 8, 2, 9, 2, 1, 1, 0, 4, 3]
>>> items.count(1)
3
<list>.index(<item>) поверне номер index першого входження переданого елемента.
Якщо входжень немає, виникає ValueError.
Якщо точна позиція елемента не потрібна, вбудований оператор in ефективніший для перевірки, чи містить масив задане значення.
Індексація починається з нуля зліва, тож «перший» елемент має позицію 0.
Індексація також працює справа, починаючи з -1.
>>> items = [7, 4, 1, 0, 2, 5]
>>> items.index(4)
1
>>> items.index(10)
ValueError: 10 is not in list
Можна також указати індекси start і end, щоб звузити пошук до конкретної частини list:
>>> names = ["Tina", "Leo", "Thomas", "Tina", "Emily", "Justin"]
>>> names.index("Tina")
0
>>> names.index("Tina", 2, 5)
3
Чаїтана володіє дуже популярним парком розваг. У неї лише один атракціон у самому центрі мальовничо доглянутої території: Найбільші американські гірки у світі(TM). Хоча це лише один атракціон, люди з усього світу приїжджають і годинами стоять у черзі, щоб мати нагоду прокататися на гіпергірках Чаїтани.
Для цього атракціону є дві черги, кожна з яких представлена як list:
Нас попросили написати трохи коду, щоб краще керувати гостями парку. Потрібно якнайшвидше реалізувати наведені нижче функції, поки гості (і наш бос, Чаїтана!) не почали бурчати. Читаймо уважно. Деякі завдання просять змінити або оновити наявну чергу, а інші - зробити її копію.
Визначте функцію add_me_to_the_queue(), яка приймає 4 параметри <express_queue>, <normal_queue>, <ticket_type>, <person_name> і повертає відповідну чергу, оновлену з імʼям цієї людини.
<ticket_type> — це int, де 1 == express_queue, а 0 == normal_queue.<person_name> — це імʼя (як str) людини, яку треба додати до відповідної черги.>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=1, person_name="RichieRich")
...
["Tony", "Bruce", "RichieRich"]
>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=0, person_name="HawkEye")
....
["RobotGuy", "WW", "HawkEye"]
Одна людина прийшла до парку пізно, але хоче приєднатися до черги, де чекають її друзі. Але вона гадки не має, де стоять її друзі, і немає мобільного звʼязку, щоб їм зателефонувати.
Визначте функцію find_my_friend(), яка приймає 2 параметри queue і friend_name та повертає позицію імені цієї людини в черзі.
<queue> — це list людей, які стоять у черзі.<friend_name> — це імʼя друга, чий індекс (місце в черзі) потрібно знайти.Памʼятаймо: індексація починається з 0 зліва і з -1 справа.
>>> find_my_friend(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], friend_name="Steve")
...
1
Тепер, коли друзів знайдено (у завданні №2 вище), той, хто запізнився, хотів би приєднатися до них на їхньому місці в черзі.
Визначте функцію add_me_with_my_friends(), яка приймає 3 параметри queue, index і person_name.
<queue> — це list людей, які стоять у черзі.<index> — це позиція, на яку треба додати нову людину.<person_name> — це імʼя людини, яку треба додати на позицію index.Поверніть чергу, оновлену з імʼям того, хто запізнився.
>>> add_me_with_my_friends(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], index=1, person_name="Bucky")
...
["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]
Щойно з черги повідомили, що там є справді зла людина, яка штовхається, кричить і влаштовує клопоти. Треба вигнати цього порушника за погану поведінку!
Визначте функцію remove_the_mean_person(), яка приймає 2 параметри queue і person_name.
<queue> — це list людей, які стоять у черзі.<person_name> — це імʼя людини, яку треба вигнати.Поверніть чергу, оновлену без імені злої людини.
>>> remove_the_mean_person(queue=["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], person_name="Eltran")
...
["Natasha", "Steve", "Wanda", "Rocket"]
Можливо, ми не бачили двох незнайомих людей, які мають абсолютно однаковий вигляд, але неодмінно бачили незнайомих людей з однаковим імʼям (тезків)! Сьогодні їх, схоже, серед відвідувачів дуже багато. Ми хочемо знати, скільки разів певне імʼя трапляється в черзі.
Визначте функцію how_many_namefellows(), яка приймає 2 параметри queue і person_name.
<queue> — це list людей, які стоять у черзі.<person_name> — це імʼя, яке, на нашу думку, може траплятися в черзі більше ніж один раз.Поверніть кількість входжень person_name як int.
>>> how_many_namefellows(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"], person_name="Natasha")
...
2
На жаль, сьогодні в парку завелика тиснява, тож треба видалити останню людину зі звичайної черги (їй видадуть ваучер, щоб повернутися на Fast-track іншого дня).
Потрібно визначити функцію remove_the_last_person(), яка приймає 1 параметр queue, а це масив людей, які стоять у черзі.
Треба оновити list і також return імʼя видаленої людини, щоб ми могли виписати їй ваучер.
>>> remove_the_last_person(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
'Rocket'
Для адміністративних потреб треба розташувати всі імена в заданій черзі в алфавітному порядку.
Визначте функцію sorted_names(), яка приймає 1 аргумент queue (це list людей, які стоять у черзі) і повертає sorted копію list.
>>> sorted_names(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.