প্রায়শই, ডেটা নিয়ে কাজ করার সময়, আপনি এমন একটি ডেটা লিস্ট সংরক্ষণ করতে চাবেন যেটিতে কোনো ডুপ্লিকেট ভ্যালু থাকবে না, এবং যেসব ভ্যালু চেঞ্জ করা যাবে না। উদাহরণস্বরূপ, আপনি যদি একটি গ্রসারি স্টোরে পরচেস আইডির একটি লিস্ট বানান, আপনি প্রতিটি আইডি ইউনিক চাইবেন, এবং আপনি চাইবেন কেউ আপনার লিস্টের ভ্যালুগুলো চেঞ্জ করতে না পারে।
সেই কারণেই পাইথন সেট অবজেক্ট কাজে আসে। একটি সেট হলো আইটেমের একটি আনঅর্ডারড কলেকশন যেটি শুধু ইউনিক ভ্যালু ধারণ করতে পারে।
এই টিউটোরিয়াল উদাহরণসহ পাইথন সেটের বেসিকস, এবং কীভাবে আপনি সেটের ওপর কমন অপারেশন যেমন ভ্যালু যোগ করা এবং সরানো পারফর্ম করতে পারেন সেটি আলোচনা করবে।
পাইথন সেট
পাইথন বিল্ট-ইন সেট ডেটা স্ট্রাকচার গাণিতিক সেটের আইডিয়ার সাথে সাদৃশ্য রেখে।
পাইথন সেট শূন্য বা অধিক এলিমেন্ট ধারণ করতে পারে, এবং সেটের প্রতিটি এলিমেন্টের জন্য কোনো ডিফাইনড অর্ডার নেই। একটি সেটের ভিতরে সংরক্ষিত প্রতিটি এলিমেন্ট ইউনিক, তাই কোনো ডুপ্লিকেট অস্তিত্বে থাকতে পারে না, এবং সেটের প্রতিটি ইনডিভিজুয়াল ভ্যালু চেঞ্জ করা যাবে না।
যদিও একটি সেটের ইনডিভিজুয়াল ভ্যালু চেঞ্জ করা যাবে না, কিন্তু সেটটি নিজে চেঞ্জ করা যায়। এর মানে আমরা আমাদের সেট থেকে আইটেম যোগ বা বাদ দিতে পারি।
সেট স্ট্রাকচার উপকারী কারণ এটি কিছু ম্যাথেমেটিক্যাল অপারেশন সাথে আসে যেগুলো আমরা আমাদের সেটে সংরক্ষিত ডেটার সাথে কাজ করতে ব্যবহার করতে পারি।
পাইথন সেট তৈরি করা
পাইথনে, সেট ডিফাইন করা হয় আইটেমের একটি লিস্ট (বা "এলিমেন্ট") দিয়ে যেগুলো কমা দিয়ে সেপারেট করা। লিস্টটি তারপর কার্লি ব্রেস ({}) এর মধ্যে এনক্লোজ করা হয়।
পাইথন সেট যেকোনো সংখ্যক আইটেম সংরক্ষণ করতে পারে, এবং একটি সেটের প্রতিটি আইটেম ভিন্ন ডেটা টাইপ ব্যবহার করতে পারে। তাই, একটি সেট ইন্টিজার বা স্ট্রিং উভয়ই সংরক্ষণ করতে পারে, অথবা একটি স্ট্রিং, ফ্লোট, এবং একটি টাপল। যাইহোক, সেট মিউটেবল ডেটা টাইপ সংরক্ষণ করতে পারে না, যেমন অন্য একটি সেট, একটি ডিকশনারি, বা একটি লিস্ট।
ধরি আমরা একটি সেট তৈরি করতে চাই যেটি একটি ইংরেজি ক্লাসের জন্য একজন স্টুডেন্ট যে হোমওয়ার্ক অ্যাসাইনমেন্টগুলো জমা দিয়েছে সেটি সংরক্ষণ করবে। আমরা নিচের কোড ব্যবহার করে এই সেটটি তৈরি করতে পারি:
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7", "End of Topic Review #2"}
print(assignments)
আমাদের কোড রিটার্ন করে:
{'Worksheet #5', 'Worksheet #4', 'Worksheet #7', 'End of Topic Review #2'}
আমাদের কোডে, আমরা assignments নামে একটি সেট ডিফাইন করেছি যেটির চারটি ভ্যালু আছে। তারপর, আমরা অ্যাসাইনমেন্ট সেটের কন্টেন্ট কনসোলে প্রিন্ট করেছি। আপনি দেখতে পাচ্ছেন যে আমাদের ভ্যালুগুলো র্যান্ডম অর্ডারে রিটার্ন হয়েছে কারণ সেট তাদের আইটেম কোনো নির্দিষ্ট অর্ডারে সংরক্ষণ করে না।
একটি সেট চেঞ্জ করা
যখন আপনি একটি সেট তৈরি করলেন, আপনি সেটের আইটেমের ভ্যালু চেঞ্জ করতে পারবেন না। যাইহোক, আপনি একটি সেটে আইটেম যোগ করতে পারেন এবং সেট থেকে আইটেম সরাতে পারেন।
একটি সেটে আইটেম যোগ করা
একটি পাইথন সেটে একটি এলিমেন্ট যোগ করতে, আপনি add() মেথড ব্যবহার করতে পারেন। ধরুন একজন স্টুডেন্ট ঠিক এখন Worksheet #8 জমা দিয়েছে এবং আমরা আমাদের সেট আপডেট করতে চাই যাতে স্টুডেন্টের অ্যাসাইনমেন্ট জমা দেওয়া ট্র্যাক রাখা যায়। আমরা নিচের কোড ব্যবহার করে এটি করতে পারি:
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7", "End of Topic Review #2"}
assignments.add("Worksheet #8")
print(assignments)
আমাদের কোড রিটার্ন করে:
{'Worksheet #8', 'Worksheet #4', 'Worksheet #5', 'End of Topic Review #2', 'Worksheet #7'}
আপনি দেখতে পাচ্ছেন, Worksheet #8 আমাদের সেটে যোগ হয়েছে।
অতিরিক্তভাবে, আপনি যদি একসাথে একাধিক আইটেম একটি সেটে যোগ করতে চান, তবে আপনি update() মেথড ব্যবহার করতে পারেন। update() মেথড আপনি যে আইটেমগুলো একটি সেটে যোগ করতে চান সেগুলোর একটি লিস্ট প্যারামিটার হিসেবে নেয়, তারপর সেগুলো সেটে যোগ করে।
ধরি একজন স্টুডেন্ট অ্যাসাইনমেন্ট #৮ এবং #৯ উভয়ই জমা দিয়েছে। আমরা আমাদের সেট চেঞ্জ করতে পারি এই নতুন অ্যাসাইনমেন্ট জমা দেওয়া রিফ্লেক্ট করার জন্য এই কোড ব্যবহার করে:
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7", "End of Topic Review #2"}
assignments.update(["Worksheet #8", "Worksheet #9"])
print(assignments)
আমাদের কোড রিটার্ন করে:
{'Worksheet #9', 'End of Topic Review #2', 'Worksheet #8', 'Worksheet #7', 'Worksheet #4', 'Worksheet #5'}
এখন আমাদের সেটে দুটি নতুন ভ্যালু আছে: Worksheet #8 এবং Worksheet #9।
একটি সেট থেকে এলিমেন্ট সরানো
একটি সেট থেকে একটি এলিমেন্ট সরাতে, আপনি discard() বা remove() ব্যবহার করতে পারেন।
discard() ফাংশন একটি সেট থেকে একটি আইটেম সরায় এবং কিছুই রিটার্ন করে না যদি একটি আইটেম সেটেexist না করে। remove() ফাংশন একটি সেট থেকে একটি আইটেম সরানোর চেষ্টা করে, এবং যদি সেই আইটেম অস্তিত্বে না থাকে, একটি এরর রেইজ করা হবে।
ধরি আমরা আমাদের স্টুডেন্টের হোমওয়ার্ক অ্যাসাইনমেন্টের রেকর্ড থেকে Worksheet #9 সরাতে চাই কারণ তাদের অ্যাসাইনমেন্টটি রি-ডু করতে বলা হয়েছে। আমরা নিচের কোড ব্যবহার করে এটি করতে পারি:
assignments = {'Worksheet #9', 'End of Topic Review #2', 'Worksheet #8', 'Worksheet #7', 'Worksheet #4', 'Worksheet #5'}
assignments.discard("Worksheet #9")
print(assignments)
আমাদের কোড রিটার্ন করে:
{'End of Topic Review #2', 'Worksheet #5', 'Worksheet #4', 'Worksheet #8', 'Worksheet #7'}
আপনি দেখতে পাচ্ছেন যে Worksheet #9 ভ্যালুটি আমাদের সেট থেকে সরানো হয়েছে। আমরা এটি discard() মেথড ব্যবহার করে সম্পন্ন করেছি।
একটি সেট ক্লিয়ার করা
একটি সেট ক্লিয়ার করতে, আপনি clear() মেথড ব্যবহার করতে পারেন। ধরুন আমরা একটি স্টুডেন্টের অ্যাসাইনমেন্টের রেকর্ড ইরেজ করতে চাই কারণ এটি ইয়ার এন্ড এবং আমাদের আর ইনফরমেশন সংরক্ষণ করার প্রয়োজন নেই। আমরা নিচের কোড ব্যবহার করে এটি করতে পারি:
assignments = {'Worksheet #9', 'End of Topic Review #2', 'Worksheet #8', 'Worksheet #7', 'Worksheet #4', 'Worksheet #5'}
assignments.clear()
print(assignments)
আমাদের কোড রিটার্ন করে: {}। এটি আমাদের খালি সেট রিফ্লেক্ট করে।
একটি সেটের লেন্থ রিটার্ন করা
একটি সেটে কতগুলো আইটেম সংরক্ষিত আছে তা জানতে, আপনি len() মেথড ব্যবহার করতে পারেন।
ধরি আমরা জানতে চাই একজন স্টুডেন্ট কতগুলো হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিয়েছে। আমরা নিচের কোড ব্যবহার করে এটি করতে পারি:
assignments = {'Worksheet #9', 'End of Topic Review #2', 'Worksheet #8', 'Worksheet #7', 'Worksheet #4', 'Worksheet #5'}
print(len(assignments))
আমাদের কোড রিটার্ন করে: 6। আমাদের কোডে, আমরা প্রথম assignments নামে একটি সেট ডিক্লেয়ার করি। তারপর, আমরা len() মেথড ব্যবহার করি বের করতে assignments সেটে কতগুলো আইটেম সংরক্ষিত।
পাইথন সেট অপারেশন
ডেটা সংরক্ষণের জন্য সেট ব্যবহার করার সুবিধাগুলোর মধ্যে একটি হলো সেট ম্যাথেমেটিক্যাল সেট অপারেশন সাপোর্ট করে। চলুন তিনটি মূল সেট অপারেশন কীভাবে কাজ করে সেটি ওয়াক থ্রু করি।
এই সেট অপারেশনগুলো কোনোভাবে চেঞ্জ করে না সেটের কন্টেন্ট। বদলে, সেগুলো একটি এক্সিস্টিং সেটের ওপর একটি ক্যালকুলেশন পারফর্ম করে।
সেট ইউনিয়ন
union() মেথড আমাদের দুটি সেট থেকে সকল এলিমেন্ট ধারণকারী একটি সেট তৈরি করতে দেয়।
ধরি আমাদের একটি স্টুডেন্টের অ্যাসাইনমেন্টের দুটি লিস্ট আছে যেগুলো আমরা একসাথে 머জ করতে চাই। একটি লিস্ট স্টুডেন্টের হোমওয়ার্কের ডেটা ধারণ করে, এবং অন্যটি স্টুডেন্ট যে এসেসামেন্টগুলো কমপ্লিট করেছে তার লিস্ট ধারণ করে। আমরা এই লিস্টগুলো 머জ করতে নিচের কোড ব্যবহার করতে পারি:
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7"}
essays = {"Essay #1", "Essay #2"}
homework = assignments.union(essays)
print(homework)
আমাদের কোড রিটার্ন করে:
{'Worksheet #7', 'Essay #2', 'Worksheet #4', 'Essay #1', 'Worksheet #5'}
আমাদের কোডে, আমরা আমাদের দুটি সেট একসাথে 머জ করতে union() মেথড ব্যবহার করেছি। আমরা নতুন 머জ করা সেটের ভ্যালু homework ভেরিয়েবলে অ্যাসাইন করেছি। তারপর, আমরা homework ভেরিয়েবলের ভ্যালু প্রিন্ট আউট করেছি।
বিকল্পভাবে, আমরা নিচের কোডও ব্যবহার করতে পারতাম:
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7"}
essays = {"Essay #1", "Essay #2"}
print(assignments | essays)
"|" অপারেটর একটি ইউনিয়ন সেট অপারেশন পারফর্ম করে। আমাদের কোড একটি 머জ করা সেট রিটার্ন করে:
{'Essay #2', 'Worksheet #4', 'Worksheet #5', 'Essay #1', 'Worksheet #7'}
সেট ইন্টারসেকশন
intersection() মেথড আপনাকে দুটি সেটের মাঝপথে কমন এলিমেন্টের একটি লিস্ট জেনারেট করতে দেয়।
ধরি আমাদের একটি স্টুডেন্ট যে এসেস জমা দিয়েছে তার লিস্ট আছে, এবং ইস্যু করা হয়েছে এমন এসেসের লিস্ট আছে। যদি আমরা জানতে চাই কোন এসেসগুলো স্টুডেন্ট এখনো জমা দিয়েছে না, তবে আমরা ইন্টারসেকশন মেথড পারফর্ম করতে পারি।
এখানে আমরা যে কোডটি ব্যবহার করব:
essays_handed_in = {"Essay #1", "Essay #2"}
essays_issued = {"Essay #1", "Essay #2", "Essay #3"}
due = essays_handed_in.intersection(essays_issued)
print(due)
আমাদের কোড রিটার্ন করে:
{'Essay #1', 'Essay #2'}
এই উদাহরণে, আমরা intersection() মেথড ব্যবহার করেছি সকল এলিমেন্ট খুঁজে বের করতে যেগুলো essays_handed_in এবং essays_issued উভয় সেটেই এক্সিস্ট করে। আমরা ইন্টারসেকশন অপারেশনের রেজাল্ট due ভেরিয়েবলে অ্যাসাইন করেছি, যেটি আমরা তারপর কনসোলে প্রিন্ট করেছি।
অতিরিক্তভাবে, আমরা & অপারেটর ব্যবহার করতে পারি একটি সেট ইন্টারসেকশন অপারেশন পারফর্ম করতে। তাই, আমরা যদি আমাদের আগের দুটি সেটের ওপর ইন্টারসেকশন পারফর্ম করতে চাই, তবে আমরা নিচের কোড ব্যবহার করতে পারি:
essays_handed_in = {"Essay #1", "Essay #2"}
essays_issued = {"Essay #1", "Essay #2", "Essay #3"}
print(essays_handed_in & essays_issued)
আমাদের কোড রিটার্ন করে:
{'Essay #1', 'Essay #2'}
সেট ডিফারেন্স
difference() মেথড আপনাকে বের করতে দেয় কোন এলিমেন্টগুলো একটি সেটে প্রেজেন্ট কিন্তু অন্য সেটে প্রেজেন্ট নয়।
ধরি আমরা এমন সব এসেসের একটি লিস্ট জেনারেট করতে চাই যেগুলো স্টুডেন্ট জমা দিয়েছে কিন্তু এখনো গ্রেড করা হয়নি। আমরা নিচের কোড ব্যবহার করে এটি করতে পারি:
essays_handed_in = {"Essay #1", "Essay #2"}
essays_graded = {"Essay #1"}
final = essays_handed_in.difference(essays_graded)
print(final)
আমাদের কোড রিটার্ন করে:
{"Essay #2"}
এই কোডে, আমরা difference() মেথড ব্যবহার করেছি essays_handed_in এবং essays_graded সেটের মাঝপথে ডিফারেন্স বের করতে। বিকল্পভাবে, আমরা - অপারেটর ব্যবহার করতে পারি, এরকম:
essays_handed_in = {"Essay #1", "Essay #2"}
essays_graded = {"Essay #1"}
print(essays_handed_in - essays_graded)
আমাদের কোড রিটার্ন করে:
{"Essay #2"}
আমাদের কোডে একই রেজাল্ট রিটার্ন হয়েছে। কিন্তু difference() সেট মেথডের বদলে, আমরা - অপারেটর ব্যবহার করেছি, যেটি দুটি সেটের মাঝপথে ডিফারেন্স খুঁজে বের করতে চেক করে।
উপসংহার
পাইথন সেট ডেটা স্ট্রাকচার আপনাকে আইটেমের আনঅর্ডারড কলেকশন সংরক্ষণ করতে দেয়।
এক সেটের প্রতিটি আইটেম ইউনিক হতে হবে, তাই কোনো ডুপ্লিকেট অস্তিত্বে থাকতে পারে না, এবং একবার সেটে যোগ হলে সেটের কন্টেন্ট চেঞ্জ করা যাবে না।
এই টিউটোরিয়াল উদাহরণসহ পাইথন সেটের বেসিকস এবং সেট দ্বারা অফার করা মূল অপারেশনগুলো আলোচনা করেছি।
আমরা শুধু সেটের সাথে আপনি কী কী করতে পারেন সেটি সক্র্যাচ করেছি - আরও অনেক কিছু এক্সপ্লোর করা বাকি - কিন্তু আমরা মূল স্কিলগুলো কভার করেছি যেগুলো আপনাকে সেটের সাথে কার্যকরভাবে কাজ করতে জানতে হবে। এখন আপনি পাইথন set() মেথড প্রো처럼 ব্যবহার শুরু করতে পারেন!
পাইথন বিশ্বব্যাপী প্রফেশনাল ডেভেলপমেন্ট এনভায়রনমেন্টে ডেটা অ্যানালাইসিস থেকে ওয়েব ডেভেলপমেন্ট পর্যন্ত সবকিছুতে ব্যবহার হয়। আজই ফ্রি Career Karma অ্যাপ ডাউনলোড করুন পাইথন প্রোগ্রামিং-এ ক্যারিয়ার পাথ সম্পর্কে আরও জানতে।