টা

টাপল মধ্যে Python

15টি অনুশীলনী

টাপল সম্পর্কে

একটি টাপল হলো ক্রমানুসারে সাজানো এলিমেন্টের একটি ইমিউটেবল কলেকশন।

বেশিরভাগ কলেকশনের মতো (দেখুন বিল্ট-ইন list, dict ও set), tuples যেকোনো (বা একাধিক) ডেটা টাইপ ধারণ করতে পারে, এমনকি অন্য tuples-ও। for item in <tuple> গঠন ব্যবহার করে টাপলের এলিমেন্টগুলো ইটারেট করা যায়। এলিমেন্টের ইনডেক্স ও মান দুটোই দরকার হলে for index, item in enumerate(<tuple>) ব্যবহার করা যায়।

যেকোনো সিকোয়েন্স-এর মতোই, tuples-এর ভেতরের এলিমেন্টগুলো বন্ধনী নোটেশন দিয়ে অ্যাক্সেস করা যায়। এর জন্য বাম দিক থেকে 0-based index নম্বর বা ডান দিক থেকে -1-based index নম্বর ব্যবহার করা হয়। টাপল সম্পূর্ণ বা আংশিকভাবে স্লাইস নোটেশন বা <tuple>.copy() দিয়ে কপি করা যায় এবং এটি সব সাধারণ সিকোয়েন্স অপারেশন সাপোর্ট করে। ইমিউটেবল হওয়ায় tuples মিউটেবল সিকোয়েন্স অপারেশন সাপোর্ট করে না।

অন্য কলেকশন টাইপের তুলনায় টাপল খুব কম মেমরি জায়গা নেয় এবং ইনডেক্স ব্যবহার করার সময় এর অ্যাক্সেস টাইম ধ্রুবক (O(1))। তবে একবার তৈরি হয়ে গেলে এগুলোর আকার বদলানো, সাজানো বা পরিবর্তন করা যায় না, তাই ডেটায় ঘন ঘন পরিবর্তন বা আপডেট দরকার হলে এগুলো কম নমনীয়। ঘন ঘন আপডেট বা সম্প্রসারণ প্রয়োজন হলে list, collections.deque বা array.array হয়তো আরও ভালো ডেটা স্ট্রাকচার হতে পারে।


টাপল তৈরি করা

টাপল বিভিন্নভাবে তৈরি করা যায়। এর জন্য tuple ক্লাস কনস্ট্রাক্টর বা (<element_1>, <element_2>) (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,)

স্ট্রিং ইটারেবল, তাই tuple() কনস্ট্রাক্টরে আর্গুমেন্ট হিসেবে একটি str পাঠালে চমকপ্রদ ফলাফল আসতে পারে:

# 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)

dict-এর ক্ষেত্রে ডিফল্ট ইটারেশন চলে এর কী (key)-গুলোর উপর। ডিকশনারি থেকে তৈরি টাপলে কী (key) ও মান দুটোই রাখতে <dict>.items() ব্যবহার করুন, যা (key, value) tuples-এর একটি ইটারেটর রিটার্ন করবে।

>>> source_data = {"fish": "gold", "monkey": "brown"}

>>> multiple_elements_dict_1 = tuple(source_data)
('fish', 'monkey')

>>> multiple_elements_dict_2 = tuple(source_data.items())
(('fish', 'gold'), ('monkey', 'brown'))
একটি টাপল লিটারাল হিসেবে ডিক্লেয়ার করা:

tuple() কনস্ট্রাক্টর কেবল ইটারেবল (বা কিছুই না) আর্গুমেন্ট হিসেবে নেয়, তাই লিটারাল পদ্ধতিতে এক-এলিমেন্টের টাপল তৈরি করা অনেক সহজ।

>>> no_elements = ()
()

>>> one_element = ("Guava",)
("Guava",)

মনে রাখবেন, সাধারণত tuple লিটারাল তৈরি করতে বন্ধনী লাগে না, কেবল কমা লাগে। তবে বেশিরভাগ ক্ষেত্রেই (<element_1>, <element_2>) ব্যবহার করাকে বেশি পাঠযোগ্য বলে ধরা হয়। বন্ধনী আবার প্রয়োজন হয় সেসব ক্ষেত্রে যেখানে অস্পষ্টতার সুযোগ থাকে, যেমন খালি বা এক-আইটেমের টাপল, বা কোনো ফাংশন যখন আর্গুমেন্ট হিসেবে টাপল নেয়।

>>> elements_separated_with_commas = "Parrot", "Bird", 334782
("Parrot", "Bird", 334782)

>>> elements_with_commas_and_parentheses = ("Triangle", 60, 60, 60)
("Triangle", 60, 60, 60)

অন্য ডেটা স্ট্রাকচারও 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')

ডেটা অ্যাক্সেস করা

টাপলের ভেতরের এলিমেন্টগুলো (অন্য সিকোয়েন্স টাইপ str ও list-এর মতো) বন্ধনী নোটেশন দিয়ে অ্যাক্সেস করা যায়। ইনডেক্স হতে পারে left --> right (শূন্য থেকে শুরু) অথবা right --> left (-1 থেকে শুরু)। টাপল সম্পূর্ণ বা আংশিকভাবে স্লাইস নোটেশন বা <tuple>.copy() দিয়ে কপি করা যায়।

>>> student_info = ("Alyssa", "grade 3", "female", 8)

#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa

>>> student_name = student_info[-4]
Alyssa

#age is at index 3 or index -1
>>> student_age_1 = student_info[3]
8

>>> student_age_2 = student_info[-1]
8

এলিমেন্টের উপর ইটারেশন

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.

সমজাতীয় তথ্য হিসেবে টাপল

টাপল প্রায়ই রেকর্ড হিসেবে ব্যবহৃত হয়, যাতে থাকে সাংগঠনিক বা ধারণাগতভাবে সমজাতীয় ডেটা, যা তথ্যের একটি একক হিসেবে ধরা হয়, এমনকি যদি আলাদা আলাদা এলিমেন্ট ভিন্নজাতীয় ডেটা টাইপের হয়।

>>> student_info = ("Alyssa", "grade 3", "female", 8)

সমজাতীয়, ইমিউটেবল ডেটা সিকোয়েন্স যখন hashability, set-এ সংরক্ষণ, বা ডিকশনারিতে কী (key) তৈরির জন্য দরকার হয়, তখনও টাপল ব্যবহৃত হয়।

মনে রাখবেন, বেশিরভাগ ক্ষেত্রেই tuples ইমিউটেবল, কিন্তু যেহেতু এরা যেকোনো ডেটা স্ট্রাকচার বা অবজেক্ট ধারণ করতে পারে, তাই এদের কোনো এলিমেন্ট মিউটেবল টাইপ হলে tuples নিজেই মিউটেবল হয়ে যেতে পারে। একটি tuple-এর ভেতরে মিউটেবল ডেটা টাইপ ব্যবহার করলে সেই tuple আন-হ্যাশেবল হয়ে যায়।

>>> cmyk_color_map = {
        (.69, .3, .48, .1) : ("Teal 700", (59, 178, 146), 0x3BB292),
        (0, .5, 1, 0) : ("Pantone 151", (247, 127, 1), 0xF77F01),
        (.37, .89, 0, .44) : ("Pantone 267", (89, 16, 142), 0x59108E),
        (0, 1, .46, .45) : ("Pantone 228", (140, 0, 76), 0x8C004C)
    }

>>> unique_rgb_colors = {
        (59, 178, 146),
        (247, 127, 1),
        (89, 16, 142),
        (140, 0, 76),
        (76, 0, 140)
     }

>>> teal_700 = hash((59, 178, 146))

>>> teal_700 = hash(("Pantone 228", [(140, 0, 76), 0x8C004C]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

সম্প্রসারিত টাপল ও সংশ্লিষ্ট ডেটা টাইপ

টাপল প্রায়ই রেকর্ড হিসেবে ব্যবহৃত হয়, তবে এর ভেতরের ডেটা কেবল পজিশন/ইনডেক্স দিয়ে অ্যাক্সেস করা যায়। collections মডিউলের namedtuple() ক্লাস সাধারণ টাপলের কার্যকারিতা বাড়িয়ে নাম দিয়ে এলিমেন্ট অ্যাক্সেস করার সুযোগ দেয়। এছাড়া ব্যবহারকারীরা dataclass ব্যবহার করে একই রকম নামযুক্ত অ্যাট্রিবিউটের সুবিধা পেতে পারেন, যদিও এর কিছু সুবিধা-অসুবিধা আছে।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

টাপল শিখুন

অনুশীলন লক করা আছে

টাপল অনুশীলন করতে আরও 5টি অনুশীলনী আনলক করুন