৮.১) Table

Range[]

আমরা যদি একটা লিস্ট বানাতে চাই যার মধ্যে এক থেকে ২০ পর্যন্ত সংখ্যা গুলো থাকবে তাহলে কীভাবে করবো? আমরা চাইলে এভাবে করতে পারি {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18,20} কিন্তু ব্যাপারটা খুব বোরিং এবং inefficient। এই কাজটা সহজ করার জন্য ম্যাথম্যাটিকায় বিল্ট ইন ফাংশন আছে, যার নাম Range[]। আমরা যদি Range[20]দিই তাহলে আগের লিস্ট টা পেয়ে যাব।

আমরা যদি ১ থেকে ২০ না চেয়ে ৫০ থেকে ৮০ চাইতাম? তাহলে আমাদেরকে রেঞ্জ এর মধ্যে লোয়ার লিমিট আর আপার লিমিট কমা দিয়ে লিখতে হতো Range[50,80] এভাবে।

এখন, আমরা ৫০-৮০ পর্যন্ত প্রতিটা সংখ্যা না নিয়ে দুই ঘর পরপর সংখ্যা গুলো যদি নিতে চাইতাম? যেমন ৫০ ৪২ ৪৪ ৫৬...এরকম? তাহলে আমরা লিখতাম Range[50, 80, 2] এভাবে আমরা ১ থেকে ২০ পর্যন্ত শুধু বিজোড় বা জোড় সংখ্যাগুলো দেখাতে পারি। যেমন,

আমরা লক্ষ্য করলে দেখবো, রেঞ্জ ফাংশনটা খুব একটা পাওয়ারফুল না, এটাকে কাস্টমাইজ করা যায় না। মানে, এখানে আমরা একটা ইন্টারভালের মধ্যের কিছু নির্দিষ্ট পূর্ণ সংখ্যাই পেতে পারি, এর বেশি কিছু না। আমরা যদি ১ থেকে ১০ এর বর্গের একটা লিস্ট পেতে চাইতাম, তাহলে কি রেঞ্জ দিয়ে সে কাজটা করতে পারতাম? না, রেঞ্জ দিয়ে আমরা সেই কাজ টা সরাসরি করতে পারতাম না। এর জন্য আমাদের একটা বিল্ট-ইন ফাংশন আছে যার নাম TableTable[] অনেকটা Range[] এর মতোই, কিন্তু আরও ফ্লেক্সিবল।

Table[]

Table[] অনেকটা এভাবে কাজ করে: প্রথমে একটা expression থাকে, এই expression টা কে আমরা ধারা বা সিরিজের সাধারণ পদ এর মতো চিন্তা করতে পারি। এই expression এ একটা ভ্যারিয়েবল থাকে। আমরা Table এর ২য় অংশে এই ভ্যারিয়েবলর একটা রেঞ্জ বলে দিই, Tableএই রেঞ্জ এর প্রতিটা মান নিয়ে সেই ভ্যারিয়েবলের জায়গায় বসায়, এবং যেসব ভ্যালু পায় সেটা দিয়ে একটা লিস্ট জেনারেট করে। উদাহরণ দেখলে ব্যাপারটা আরও ক্লিয়ার হবে:

এখানে 2*n-1 হচ্ছে আমাদের সেই expression, এবং n হচ্ছে সেই ভ্যারিয়েবল। expression এর পর কমা দিয়ে n এর একটা ইন্টারভাল বলে দেওয়া হয়, এক্ষেত্রে 1 থেকে 10 পর্যন্ত পূর্ণসংখ্যা থাকবে সেই ইন্টারভালে। এই ইন্টারভাল থেকে একটা একটা করে মান n এর মধ্যে যাবে এবং 2*n-1 expression এ গিয়ে বসে একটা ভ্যালু তৈরী করবে। এরকম ইন্টারভালের সব ভ্যালু নিয়ে একটা লিস্ট তৈরী হয়ে যাবে, যা কিনা Table[] এর আউটপুট। এক্ষেত্রে লিস্ট টা হবে প্রথম ১০টা বিজোড় সংখ্যার লিস্ট। আর আমরা যদি ১ থেকে ১০ পর্যন্ত পূর্ণসংখ্যাগুলোর বর্গ এর লিস্ট বানাতে চাই, তাহলে আমাদের আগে এক্সপ্রেশন টা অর্থাৎ সাধারণ পদ টা কী হবে সেটা জানতে হবে। আমরা জানি বর্গের সাধারণ পদ হলো n2n^2, তাই Table[] এর expression এর জায়গায় n2n^2 দিব, এবং রেঞ্জ বলে দিব ১ থেকে ১০। কার রেঞ্জ এটা? n এর ,তাই সেটাও বলে দিতে হবে।

এমন না যে আমাদের শুধু n দিয়েই এক্সপ্রেশন এর ভ্যারিয়েবল কে প্রকাশ করতে হবে। আমরা চাইলে যেকোনো ভ্যালিড ভ্যারিয়েবলের নাম দিতে পারবো, তবে লক্ষ্য রাখতে হবে, এক্সপ্রেশনে আমরা যে নাম দিতেছি, রেঞ্জেও যেন একই নামই দিই। আরও কিছু উদাহরণের মাধ্যে জিনিসটা দেখা যাক।

এখানে সাধারণ পদের ভ্যারিয়েবল হিসেবে যথাক্রমে x এবং i ব্যবহার করা হয়েছে।
এখানে রেঞ্জের জন্য ভ্যারিয়েবল ব্যবহার করলেও expression এ কোনো ভ্যারিয়েবল ইউজ করা হয় নি, তাই "A" এর ১০ টা সেম কপি তৈরী হয়েছে শুধু
10 থেকে 15 পর্যন্ত সংখ্যাগুলির বর্গ
10 থেকে 15 পর্যন্ত ২ঘর পরপর সংখ্যাগুলির বর্গ
শুধু 1,5,6,10 এর বর্গ

Nested Table

এই পার্টটা একটু ট্রিকি হবে। তাই ঠাণ্ডা মাথায় পড়ার পরামর্শ রইলো।

Nested কথাটার অর্থ হলো একটার ভেতরে আরেকটা। তো স্বাভাবিকভাবেই Nested Table এর অর্থ দাঁড়ায়, একটা টেবিল(এক্ষেত্রে লিস্ট) এর মধ্যে আরেকটা টেবিল(লিস্ট)। ব্যাপারটাকে আমরা Power Set এর মতো চিন্তা করতে পারি। Power সেটের প্রতিটা উপাদান যেমন নিজেই একটা সেট, ঠিক তেমনি nested list এর প্রতিটা উপাদানও একেকটা লিস্ট। যেমন:

লিস্টের ভেতরে লিস্ট

এখন কথা হচ্ছে, আমরা তো ম্যানুয়ালি একটা নেস্টেড লিস্ট তৈরী করলাম, যদি Table[] এর মাধ্যমে শুধু expression দিয়ে একটা নেস্টেড লিস্ট তৈরী করতে চাইতাম, তাহলে কী করতে হতো? তার জন্য আমরা expression এর জায়গায় আরেকটা Table কমান্ড ইউজ করতাম। যেমন:

এখানে, ভেতরের টেবিলের expression (নীল বক্স) টা হলো "hi", এবং এটার উপর ইন্টারভাল হিসেবে 1 থেকে 2 কাজ করতেছে। তাই ভেতরে আগে একটা লিস্ট তৈরী হবে ( {hi, hi} ) যা বাইরের টেবিলের জন্য expression হিসেবে কাজ করবে। তখন বাইরের টেবিল টা দেখতে এরকম দেখাবে Table[{hi, hi}, {j, 1, 3}] , ফলে এমন একটা লিস্ট আমরা পাবো, যেখানে ৩টা উপাদান থাকবে এবং প্রতিটা উপাদান হবে {hi, hi} । যদি বুঝতে অসুবিধা হয় তাহলে আমি সাজেস্ট করবো এই সেকশনের শুরু থেকে কয়েকবার পড়তে।

আরেকটা উদাহরণ দেখা যাক:

এটা দেখে ভয় পাওয়ার কিছু নাই, আমরা স্টেপ বাই স্টেপ দেখবো এখানে কী হচ্ছে আসলে।

  • এটা একটা Nested Table, যার inner table টা হচ্ছে Table[i/j, {i,1,3}]

  • inner table এর expression হচ্ছে i/j

  • inner table এর ভ্যারিয়েবল টা i আর j হচ্ছে outer table এর ভ্যারিয়েবল

  • প্রথমে ভেতরের table টা run হবে ভেতরের variable এবং এর range (এখানে i এর রেঞ্জ হলো 1 থেকে 3) দিয়ে। অর্থাৎ, i/ji এর জায়গায় একে একে 1,2,3 বসবে। কিন্তু এখনও j এর ভ্যালু চেঞ্জ হবে না, কারণ এটা outer Table এর ভ্যারিয়েবল, আর আমরা আপাতত inner table নিয়ে কাজ করতেছি। তো i/ji এর জায়গায় একে একে 1,2,3 বসার পর আমরা একটা লিস্ট পাবো যা দেখতে এমন হবে {1/j, 2/j, 3/j} , এই লিস্ট টাই পরবর্তীতে outer table এর expression এর কাজ করবে।

  • আমাদের table টা Table[ Table[i/j, {i,1,3}], {j,5,7}] এখন দেখতে অনেকটা Table[ {1/j, 2/j, 3/j}, {j,5,7}] এরকম হবে। এখানে ভ্যারিয়েবল j এর রেঞ্জ হলো 5,6,7

  • এখন expression {1/j, 2/j, 3/j} এ প্রথমে j এর জায়গায় 5 বসে একটা লিস্ট তৈরী করবে {1/5, 2/5, 3/5} । এরপর j = 6 হবে, এবং লিস্ট টা হবে {1/6, 2/6, 3/6} j = 7 এর জন্য লিস্ট হবে {1/7, 2/7, 3/7}

  • তো আমরা j = 5,6,7 এর জন্য এই ৩টা লিস্ট পাচ্ছি, সেই লিস্ট গুলো কম্বাইনড হয়ে একটা লিস্টের মধ্যে থাকবে, যা কিনা আমাদের ফাইনাল আউটপুট। { {1/5, 2/5, 3/5}, {1/6, 2/6, 3/6}, {1/7, 2/7, 3/7} }

আশা করি এটা ২-৩ বার পড়লে নেস্টেড টেবিল কীভাবে নেস্টেড লিস্ট তৈরী করে তা ক্লিয়ার হবে।

আমরা Table[] এর মধ্যে Table[] দিয়ে নেস্টেড লিস্ট তৈরী করেছি, এটা অন্য ভাবেও করা যায়। তার জন্য সাধারণ পদের পর শুধু outer variable and inner variable গুলার রেঞ্জ পরপর দিলেই হয়।

এখানে খেয়াল রাখতে হবে প্রথমে outer variable এর রেঞ্জ দিতে হবে, তারপর inner

যদি আমরা Table এবং nested Tabled ভালভাবে বুঝে থাকি, তাহলে নিচের nested table টা নিজের থেকে ইন্টারপ্রিট করতে পারবো আশা করি।

Last updated