در 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,)
رشتهها تکرارپذیرند، بنابراین استفاده از یک 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
آزارا و رویی همتیمی هستند و در یک شکار گنج با حالوهوای دزدان دریایی با هم رقابت میکنند. یکی فهرستی از گنجها با مختصات نقشه دارد و دیگری فهرستی از نام مکانها با مختصات نقشه. نقشههای خالیای هم به آنها داده شده که محل شروع رویشان با «شما اینجا هستید» مشخص شده است.
| فهرست آزارا | فهرست رویی | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
اما اوضاع کمی بههمریخته است: به نظر میرسد مختصات آزارا با مختصات رویی متفاوت قالببندی و مرتب شدهاند و آنها باید مدام از یک فهرست به فهرست دیگر نگاه کنند تا بفهمند کدام گنجها با کدام مکانها جور درمیآیند. از آنجا که پایتونیستهای تازهکار هستند، برای کمک در نوشتن یک برنامهی کوچک (در واقع مجموعهای از توابع) به سراغ شما آمدهاند تا اطلاعات شکارشان را بهتر سازماندهی کنند.
تابع get_coordinate() را پیادهسازی کنید که یک جفت (treasure, coordinate) از فهرست آزارا میگیرد و فقط مختصات نقشهی استخراجشده را برمیگرداند.
>>> 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) از فهرست آزارا و یک رکورد (location, coordinate, quadrant) از فهرست رویی میگیرد و اگر مختصات جور دربیایند (treasure, coordinate, location, coordinate, quadrant) را برمیگرداند.
اگر مختصات جور درنیایند، رشتهی «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"
رکوردهای ترکیبشدهی آزارا و رویی را مرتب کنید تا برای هر رکورد فقط یک مجموعه مختصات بماند. گزارشی تهیه کنید تا بتوانند فهرست واحدی از همهی آنچه را که باید روی نقشههایشان بگذارند ببینند.
تابع 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
"""