Треки
/
Python
Python
/
Вправи
/
Полювання за скарбами в Тісбері
Полювання за скарбами в Тісбері

Полювання за скарбами в Тісбері

Навчальна вправа

Вступ

У 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
Скарб Координати
Amethyst Octopus 1F
Angry Monkey Figurine 5B
Antique Glass Fishnet Float 3D
Brass Spyglass 4B
Carved Wooden Elephant 8C
Crystal Crab 6A
Glass Starfish 6D
Model Ship in Large Bottle 8A
Pirate Flag 7F
Robot Parrot 1C
Scrimshawed Whale Tooth 2A
Silver Seahorse 4E
Vintage Pirate Hat 7E
Назва місця Координати Квадрант
Seaside Cottages ("1", "C") Blue
Aqua Lagoon (Island of Mystery) ("1", "F") Yellow
Deserted Docks ("2", "A") Blue
Spiky Rocks ("3", "D") Yellow
Abandoned Lighthouse ("4", "B") Blue
Hidden Spring (Island of Mystery) ("4", "E") Yellow
Stormy Breakwater ("5", "B") Purple
Old Schooner ("6", "A") Purple
Tangled Seaweed Patch ("6", "D") Orange
Quiet Inlet (Island of Mystery) ("7", "E") Orange
Windswept Hilltop (Island of Mystery) ("7", "F") Orange
Harbor Managers Office ("8", "A") Purple
Foggy Seacave ("8", "C") Purple

Але дещо тут заплутано: координати Azara, схоже, відформатовані й відсортовані інакше, ніж у Rui, тож їм доводиться раз у раз переводити погляд з одного списку на інший, щоб зрозуміти, які скарби відповідають яким місцям. Як пайтоністи-початківці, вони звернулися до нас по допомогу: треба написати невелику програму (насправді набір функцій), яка краще впорядкує їхню інформацію про полювання.

1. Витягти координати

Реалізуйте функцію get_coordinate(), яка приймає пару (treasure, coordinate) зі списку Azara й повертає лише витягнуту координату на карті.

>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A

2. Відформатувати координати

Реалізуйте функцію convert_coordinate(), яка приймає координату у форматі «2A» й повертає кортеж у форматі ("2", "A").

>>> convert_coordinate("2A")
("2", "A")

3. Зіставити координати

Реалізуйте функцію 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

4. Поєднати зіставлені записи

Реалізуйте функцію 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"

5. «Прибирання» та звіт про всі записи

Приберіть зайве в поєднаних записах 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
"""
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Python Exercism

Час розпочати Полювання за скарбами в Тісбері?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.