list - це змінювана колекція елементів у певній послідовності.
Як і більшість колекцій (дивіться вбудовані tuple, dict та set), масиви можуть містити посилання на будь-який (або кілька) типів даних, зокрема на інші масиви.
Як і в будь-якій послідовності, доступ до елементів здійснюється за 0-based index зліва та за -1-based index справа.
Масиви можна копіювати повністю або частково за допомогою синтаксису зрізів або <list>.copy().
Масиви підтримують як звичайні, так і змінювані операції над послідовностями, як-от min()/max(), <list>.index(), <list>.append() та <list>.reverse().
Елементи масиву можна перебирати за допомогою конструкції for item in <list>.
Конструкцію for index, item in enumerate(<list>) можна використати, коли потрібні як індекс, так і значення елемента.
Усередині lists реалізовано як динамічні масиви, подібно до типу ArrayList у Java, і найчастіше їх використовують для зберігання груп схожих даних (рядків тексту (англ. string), чисел, множин тощо) невідомої довжини.
Масиви - це надзвичайно гнучка й корисна структура даних, а багато вбудованих методів і операцій у Python повертають масиви як результат своєї роботи.
list можна оголосити як літерал за допомогою квадратних дужок [], розділяючи елементи комами:
>>> no_elements = []
>>> no_elements
[]
>>> one_element = ["Guava"]
>>> one_element
['Guava']
>>> elements_separated_with_commas = ["Parrot", "Bird", 334782]
>>> elements_separated_with_commas
['Parrot', 'Bird', 334782]
Для читабельності можна використовувати перенесення рядків, коли в list багато елементів або вкладених структур даних:
>>> lots_of_entries = [
"Rose",
"Sunflower",
"Poppy",
"Pansy",
"Tulip",
"Fuchsia",
"Cyclamen",
"Lavender"
]
>>> lots_of_entries
['Rose', 'Sunflower', 'Poppy', 'Pansy', 'Tulip', 'Fuchsia', 'Cyclamen', 'Lavender']
# Each data structure is on its own line to help clarify what they are.
>>> nested_data_structures = [
{"fish": "gold", "monkey": "brown", "parrot": "grey"},
("fish", "mammal", "bird"),
['water', 'jungle', 'sky']
]
>>> nested_data_structures
[{'fish': 'gold', 'monkey': 'brown', 'parrot': 'grey'}, ('fish', 'mammal', 'bird'), ['water', 'jungle', 'sky']]
Конструктор list() можна викликати без аргументів або з ітерабельним обʼєктом як аргументом.
Конструктор перебирає елементи ітерабельного обʼєкта й додає їх до list у тому ж порядку:
>>> no_elements = list()
>>> no_elements
[]
# The tuple is unpacked and each element is added.
>>> multiple_elements_from_tuple = list(("Parrot", "Bird", 334782))
>>> multiple_elements_from_tuple
['Parrot', 'Bird', 334782]
# The set is unpacked and each element is added.
>>> multiple_elements_from_set = list({2, 3, 5, 7, 11})
>>> multiple_elements_from_set
[2, 3, 5, 7, 11]
Результати застосування конструктора list до string чи dict можуть здивувати:
# String elements (Unicode code points) are iterated through and added *individually*.
>>> multiple_elements_string = list("Timbuktu")
>>> multiple_elements_string
['T', 'i', 'm', 'b', 'u', 'k', 't', 'u']
# Unicode separators and positioning code points are also added *individually*.
>>> multiple_code_points_string = list('अभ्यास')
>>> multiple_code_points_string
['अ', 'भ', '्', 'य', 'ा', 'स']
# The iteration default for dictionaries is over the keys, so only key data is inserted into the list.
>>> source_data = {"fish": "gold", "monkey": "brown"}
>>> multiple_elements_dict_1 = list(source_data)
['fish', 'monkey']
Оскільки конструктор list приймає як аргументи лише ітерабельні обʼєкти (або нічого), обʼєкти, які не є ітерабельними, спричинять помилку типу.
Тому створити list з одним елементом набагато простіше через літерал.
# Numbers are not iterable, and so attempting to create a list with a number passed to the constructor fails.
>>> one_element = list(16)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
# Tuples *are* iterable, so passing a one-element tuple to the constructor does work, but it's awkward
>>> one_element_from_iterable = list((16,))
>>> one_element_from_iterable
[16]
До елементів усередині масивів (як і до елементів інших типів послідовностей, str і tuple) можна звертатися за допомогою 0-based index та запису з дужками.
Індекси можуть іти від left --> right (починаючи з нуля) або від right --> left (починаючи з -1).
| індекс зліва ⟹ |
|
⟸ індекс справа |
>>> breakfast_foods = ["Oatmeal", "Fruit Salad", "Eggs", "Toast"]
# Oatmeal is at index 0 or index -4.
>>> breakfast_foods[0]
'Oatmeal'
>>> breakfast_foods[-4]
'Oatmeal'
# Eggs are at index -2 or 2
>>> breakfast_foods[-2]
'Eggs'
>>> breakfast_foods[2]
'Eggs'
# Toast is at -1
>>> breakfast_foods[-1]
'Toast'
До частини елементів усередині list можна звертатися за допомогою синтаксису зрізів (<list>[start:stop]).
Зріз визначається як послідовність елементів на позиції index, така що start <= index < stop.
Зрізування повертає копію «зрізаних» елементів і не змінює початковий list.
Параметр step також можна використати в записі [start:stop:step], щоб «перестрибувати» чи фільтрувати елементи list (наприклад, step зі значенням 2 вибере кожен другий елемент у діапазоні):
>>> colors = ["Red", "Purple", "Green", "Yellow", "Orange", "Pink", "Blue", "Grey"]
# If there is no step parameter, the step is assumed to be 1.
>>> middle_colors = colors[2:6]
>>> middle_colors
['Green', 'Yellow', 'Orange', 'Pink']
# If the start or stop parameters are omitted, the slice will
# start at index zero, and will stop at the end of the list.
>>> primary_colors = colors[::3]
>>> primary_colors
['Red', 'Yellow', 'Blue']
Вбудована функція sum(), застосована до масиву, повертає суму всіх чисел у ньому:
>>> number_list = [1, 2, 3, 4]
>>> sum(number_list)
10
Довжину масиву також можна дізнатися за допомогою функції len():
>>> long_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
>>> len(long_list)
10
Масиви також можна поєднувати в різні способи:
# Using the plus + operator unpacks each list and creates a new list, but it is not efficient.
>>> new_via_concatenate = ["George", 5] + ["cat", "Tabby"]
>>> new_via_concatenate
['George', 5, 'cat', 'Tabby']
# Likewise, using the multiplication operator * is the equivalent of using + n times.
>>> first_group = ["cat", "dog", "elephant"]
>>> multiplied_group = first_group * 3
>>> multiplied_group
['cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant']
Масиви надають ітератор, і їх можна перебирати в циклі так само, як інші типи послідовностей.
# Looping through the list and printing out each element.
>>> colors = ["Orange", "Green", "Grey", "Blue"]
>>> for item in colors:
... print(item)
...
Orange
Green
Grey
Blue
Щоб глибше розібратися з loops та iterators, пройдіть концепцію loops.
Elyse дуже хоче пограти в покер (та інші карткові ігри) під час своєї майбутньої подорожі до Вегаса. Як велика прихильниця «самовідстеження», вона хоче зібрати кілька невеликих функцій, які допоможуть їй із відстеженням, і просить нас допомогти їй усе це продумати.
Elyse особливо любить покер і хоче відстежувати, скільки раундів вона грає, і які саме раунди це були. Кожен раунд має свій номер, і кожен стіл показує номер раунду, який грають просто зараз. Elyse обирає стіл і сідає грати свій перший раунд. Вона планує зіграти три раунди.
Реалізуйте функцію get_rounds(<round_number>), яка приймає номер поточного раунду й повертає один list із цим раундом і двома наступними:
>>> get_rounds(27)
[27, 28, 29]
Elyse зіграла кілька раундів за першим столом, потім зробила перерву й зіграла ще кілька раундів за другим столом ... але для кожного столу в неї вийшов окремий масив! Вона хоче поєднати ці два масиви, щоб відстежувати всі раунди покеру в одному місці.
Реалізуйте функцію concatenate_rounds(<rounds_1>, <rounds_2>), яка приймає два масиви й повертає один list, що складається з усіх раундів першого list, а потім з усіх раундів другого list:
>>> concatenate_rounds([27, 28, 29], [35, 36])
[27, 28, 29, 35, 36]
Говорячи про деякі з попередніх раундів покеру, інший гравець зауважує, як схоже минули два з них. Elyse не певна, чи грала вона ті раунди.
Реалізуйте функцію list_contains_round(<rounds>, <round_number>), яка приймає два аргументи: масив зіграних раундів і номер раунду. Функція повертає True, якщо раунд є в масиві зіграних раундів, і False, якщо ні:
>>> list_contains_round([27, 28, 29, 35, 36], 29)
True
>>> list_contains_round([27, 28, 29, 35, 36], 30)
False
Elyse хоче спробувати нову гру під назвою Black Joe. Вона схожа на Black Jack, де мета полягає в тому, щоб сума карт у руці сягнула цільового значення, але в Black Joe треба, щоб середнє значення карт дорівнювало 7. Середнє можна знайти, додавши всі значення карт і поділивши цю суму на кількість карт у руці.
Реалізуйте функцію card_average(<hand>), яка повертає середнє значення карт у руці для Black Joe.
>>> card_average([5, 6, 7])
6.0
У Black Joe швидкість має значення. Elyse спробує знайти швидший спосіб обчислити середнє.
Вона придумала два способи отримати число, схоже на середнє:
Реалізуйте функцію approx_average_is_average(<hand>), де hand - масив зі значеннями карт у руці.
Поверніть True, якщо один or обидва з наведених вище способів дають число, рівне справжньому середньому.
Примітка: Довжина всіх рук непарна, щоб було легше знайти медіану.
>>> approx_average_is_average([1, 2, 3])
True
>>> approx_average_is_average([2, 3, 4, 8, 8])
True
>>> approx_average_is_average([1, 2, 3, 5, 9])
False
Зацікавлена результатами свого експерименту із середніми, Elyse думає, чи дасть середнє карт на парних позиціях той самий результат, що й середнє карт на непарних позиціях. Час для ще однієї тестової функції!
Реалізуйте функцію average_even_is_average_odd(<hand>), яка повертає булеве значення (англ. Boolean) і вказує, чи дорівнює середнє карт за парними індексами середньому карт за непарними індексами.
>>> average_even_is_average_odd([1, 2, 3])
True
>>> average_even_is_average_odd([1, 2, 3, 4])
False
Кожна 11-та рука в Black Joe - це бонусна рука з бонусним правилом: якщо остання карта, яку ми витягуємо, є валетом, ми подвоюємо її значення.
Реалізуйте функцію maybe_double_last(<hand>), яка приймає руку й перевіряє, чи остання карта є валетом (11). Якщо остання карта є валетом (11), подвойте її значення перед тим, як повернути руку.
>>> hand = [5, 9, 11]
>>> maybe_double_last(hand)
[5, 9, 22]
>>> hand = [5, 9, 10]
>>> maybe_double_last(hand)
[5, 9, 10]
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.