У Python кортеж - це незмінна колекція елементів, розташованих у послідовності.
Як і більшість колекцій, tuples можуть містити будь-які (або кілька) типи даних, зокрема інші tuples.
Кортежі підтримують усі звичайні операції над послідовностями, але не підтримують операції над змінними послідовностями.
Елементи кортежу можна перебирати за допомогою конструкції for item in <tuple>.
Якщо потрібні й індекс, і значення елемента, можна скористатися for index, item in enumerate(<tuple>).
Як і в будь-якій послідовності, до елементів усередині tuples можна звертатися через запис у дужках з використанням 0-based index зліва або -1-based index справа.
Кортежі також можна копіювати повністю або частково за допомогою зрізів (<tuple>[<start>:<stop>:<step>]).
Кортежі можна створювати кількома способами: за допомогою конструктора класу tuple(<iterable>) або оголошення літерала tuple.
tuple() порожнім або з ітерованим обʼєктом:>>> no_elements = tuple()
()
# The constructor *requires* an iterable, so single elements must be passed in a list or another tuple.
>>> one_element = tuple([16])
(16,)
Рядки тексту (англ. string) можна перебирати, тож використання одного str як аргументу конструктора tuple() може дати несподіваний результат:
# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')
Елементи одного ітерованого обʼєкта додаються по одному:
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Оскільки конструктор tuple(<iterable>) приймає як аргументи лише ітеровані обʼєкти (або нічого), створити кортеж з одного елемента набагато простіше літеральним способом.
>>> no_elements = ()
()
>>> one_element = ("Guava",)
("Guava",)
Вкладені структури даних можна включати як елементи tuple, зокрема інші tuples:
>>> nested_data_structures = ({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
>>> nested_data_structures_1 = (["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
(["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
Кортежі можна зʼєднати за допомогою оператора плюс +, який розпаковує кожен tuple і створює новий обʼєднаний tuple.
>>> new_via_concatenate = ("George", 5) + ("cat", "Tabby")
("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
('cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant')
До елементів усередині tuple можна звертатися через запис у дужках з використанням 0-based index зліва або -1-based index справа.
student_info = ("Alyssa", "grade 3", "female", 8 )
#gender is at index 2 or index -2
>>> student_gender = student_info[2]
'female'
>>> student_gender = student_info[-2]
'female'
#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa
>>> student_name = student_info[-4]
Alyssa
Елементи всередині tuple можна перебирати в циклі, використовуючи синтаксис for item in <tuple>.
Якщо потрібні й індекси, і значення, можна скористатися for index, item in enumerate(<tuple>).
>>> student_info = ("Alyssa", "grade 3", "female", 8 )
>>> for item in student_info:
... print(item)
...
Alyssa
grade 3
female
8
>>> for index, item in enumerate(student_info):
... print("Index is: " + str(index) + ", value is: " + str(item) +".")
...
Index is: 0, value is: Alyssa.
Index is: 1, value is: grade 3.
Index is: 2, value is: female.
Index is: 3, value is: 8.
Оператор in можна використовувати для перевірки належності елемента до tuple.
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> "Parrot" in multiple_elements_list
True
Azara та Rui - напарники, які змагаються в піратському полюванні за скарбами. В одного з них є список скарбів із координатами на карті, а в другого - список назв місць із координатами на карті. Їм також дали порожні карти, на яких позначено місце старту - «ВИ ТУТ».
| Список Azara | Список Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Але дещо тут заплутано: координати Azara, схоже, відформатовані й відсортовані інакше, ніж у Rui, тож їм доводиться раз у раз переводити погляд з одного списку на інший, щоб зрозуміти, які скарби відповідають яким місцям. Як пайтоністи-початківці, вони звернулися до нас по допомогу: треба написати невелику програму (насправді набір функцій), яка краще впорядкує їхню інформацію про полювання.
Реалізуйте функцію get_coordinate(), яка приймає пару (treasure, coordinate) зі списку Azara й повертає лише витягнуту координату на карті.
>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A
Реалізуйте функцію convert_coordinate(), яка приймає координату у форматі «2A» й повертає кортеж у форматі ("2", "A").
>>> convert_coordinate("2A")
("2", "A")
Реалізуйте функцію compare_records(), яка приймає пару (treasure, coordinate) та запис (location, coordinate, quadrant) і порівнює координати з кожного.
Поверніть True, якщо координати «збігаються», і False, якщо ні.
За потреби переформатуйте координати, щоб порівняння було точним.
>>> compare_records(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
False
>>> compare_records(('Model Ship in Large Bottle', '8A'), ('Harbor Managers Office', ('8', 'A'), 'purple'))
True
Реалізуйте функцію create_record(), яка приймає пару (treasure, coordinate) зі списку Azara та запис (location, coordinate, quadrant) зі списку Rui й повертає (treasure, coordinate, location, coordinate, quadrant), якщо координати збігаються.
Якщо координати не збігаються, поверніть рядок тексту (англ. string) «not a match».
За потреби переформатуйте координату, щоб порівняння було точним.
>>> create_record(('Brass Spyglass', '4B'), ('Abandoned Lighthouse', ('4', 'B'), 'Blue'))
('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')
>>> create_record(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
"not a match"
Приберіть зайве в поєднаних записах Azara та Rui, щоб у кожному записі залишився лише один набір координат. Складіть звіт, щоб вони побачили один список усього, що потрібно нанести на карти.
Реалізуйте функцію clean_up(), яка приймає кортеж кортежів (усе з обох списків), проходить по зовнішньому кортежу, відкидає зайві координати з кожного внутрішнього кортежу й додає кожен до «звіту».
Відформатуйте й поверніть «звіт» так, щоб кожен очищений запис був на окремому рядку.
>>> clean_up((('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue'), ('Vintage Pirate Hat', '7E', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange'), ('Crystal Crab', '6A', 'Old Schooner', ('6', 'A'), 'Purple')))
"""
('Brass Spyglass', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')\n
('Vintage Pirate Hat', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange')\n
('Crystal Crab', 'Old Schooner', ('6', 'A'), 'Purple')\n
"""
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.