ট্র্যাক
/
Python
Python
/
অনুশীলনী
/
লোকোমোটিভ ইঞ্জিনিয়ার
লোকোমোটিভ ইঞ্জিনিয়ার

লোকোমোটিভ ইঞ্জিনিয়ার

লার্নিং অনুশীলনী

ভূমিকা

আনপ্যাকিং বলতে ইটারেশনের সাহায্যে একটি কালেকশনের এলিমেন্ট, যেমন একটি list, tuple বা dict, বের করে আনার কাজকে বোঝায়। এরপর আনপ্যাক করা মানগুলো একই স্টেটমেন্টের মধ্যে ভ্যারিয়েবলে অ্যাসাইন করা যায়, যাকে সাধারণত মাল্টিপল অ্যাসাইনমেন্ট বলা হয়।

বিশেষ অপারেটর * এবং ** প্রায়শই আনপ্যাকিংয়ের প্রসঙ্গে এবং মাল্টিপল অ্যাসাইনমেন্টের সাথে ব্যবহৃত হয়।

Caution

*<variable_name> এবং **<variable_name>-কে * এবং **-এর সাথে গুলিয়ে ফেলা উচিত নয়। * এবং ** যথাক্রমে গুণ ও সূচকের জন্য ব্যবহৃত হয়, অন্যদিকে *<variable_name> এবং **<variable_name> প্যাকিং ও আনপ্যাকিং অপারেটর হিসেবে ব্যবহৃত হয়।

মাল্টিপল অ্যাসাইনমেন্ট

মাল্টিপল অ্যাসাইনমেন্টে, অ্যাসাইনমেন্ট অপারেটরের (=) বাম দিকের ভ্যারিয়েবলের সংখ্যা ডান দিকের মানের সংখ্যার সাথে মিলতে হবে। মানগুলো আলাদা করতে কমা , ব্যবহার করুন:

>>> a, b = 1, 2
>>> a
1

যদি মাল্টিপল অ্যাসাইনমেন্টে দেওয়া মানের জন্য ভুল সংখ্যক ভ্যারিয়েবল থাকে, তাহলে একটি ValueError থ্রো করা হবে:

>>> x, y, z = 1, 2

ValueError: too many values to unpack (expected 3, got 2)

মাল্টিপল অ্যাসাইনমেন্ট একটি ডেটা টাইপে সীমাবদ্ধ নয়:

>>> x, y, z = 1, "Hello", True
>>> x
1

>>> y
'Hello'

>>> z
True

মাল্টিপল অ্যাসাইনমেন্ট lists-এর এলিমেন্ট অদলবদল করতেও ব্যবহার করা যায়। এই পদ্ধতিটি সর্টিং অ্যালগরিদমে বেশ কমন। যেমন:

>>> numbers = [1, 2]
>>> numbers[0], numbers[1] = numbers[1], numbers[0]
>>> numbers
[2, 1]

যেহেতু tuples ইমিউটেবল, তাই একটি tuple-এর এলিমেন্ট অদলবদল করা যায় না।

আনপ্যাকিং

Note

নিচের উদাহরণগুলোতে lists ব্যবহার করা হয়েছে, তবে একই ধারণা tuples-এর ক্ষেত্রেও প্রযোজ্য।

Python-এ আলাদা আলাদা ভ্যারিয়েবলে list/tuple/dictionary-এর এলিমেন্ট আনপ্যাক করা সম্ভব। যেহেতু lists/tuples-এর ভেতরে মানগুলো একটি নির্দিষ্ট ক্রমে থাকে, তাই সেগুলো একই ক্রমে ভ্যারিয়েবলে আনপ্যাক করা হয়:

>>> fruits = ["apple", "banana", "cherry"]
>>> x, y, z = fruits
>>> x
"apple"

যদি এমন কিছু মান থাকে যেগুলোর প্রয়োজন নেই, তাহলে সেগুলো চিহ্নিত করতে _ ব্যবহার করতে পারেন:

>>> fruits = ["apple", "banana", "cherry"]
>>> _, _, z = fruits
>>> z
"cherry"

ডিপ আনপ্যাকিং

একটি list বা tuple-এর ভেতরে থাকা list/tuple থেকে মান আনপ্যাক করা এবং অ্যাসাইন করা (যাকে নেস্টেড লিস্ট/টাপলও বলা হয়) শ্যালো আনপ্যাকিংয়ের মতোই কাজ করে, তবে প্রসঙ্গ বা অবস্থান স্পষ্ট করতে প্রায়শই কোয়ালিফায়ার প্রয়োজন হয়:

>>> fruits_vegetables = [["apple", "banana"], ["carrot", "potato"]]
>>> [[a, b], [c, d]] = fruits_vegetables
>>> a
"apple"

>>> d
"potato"

আপনি একটি নেস্টেড list/tuple-এর একটি অংশও ডিপ আনপ্যাক করতে পারেন:

>>> fruits_vegetables = [["apple", "banana"], ["carrot", "potato"]]
>>> [a, [c, d]] = fruits_vegetables
>>> a
["apple", "banana"]

>>> c
"carrot"

যদি আনপ্যাকিংয়ে ভ্যারিয়েবলের অবস্থান ভুল থাকে এবং/অথবা মানের সংখ্যা ভুল হয়, তাহলে আপনি একটি ValueError পাবেন:

>>> fruits_vegetables = [["apple", "banana"], ["carrot", "potato"]]
>>> [[a, b], [d]] = fruits_vegetables

ValueError: too many values to unpack (expected 1)

* দিয়ে একটি list/tuple আনপ্যাক করা

একটি list/tuple আনপ্যাক করার সময় আপনি "বাকি" মানগুলো ধরে রাখতে * অপারেটর ব্যবহার করতে পারেন। এটি list/tuple স্লাইস করার চেয়ে স্পষ্ট (যা কিছু ক্ষেত্রে কম পাঠযোগ্য)। যেমন, প্রথম এলিমেন্টটি বের করে আনা যায় এবং তারপর বাকি মানগুলো প্রথম এলিমেন্ট ছাড়া একটি নতুন list-এ রাখা যায়:

>>> fruits = ["apple", "banana", "cherry", "orange", "kiwi", "melon", "mango"]
>>> x, *last = fruits
>>> x
"apple"

>>> last
["banana", "cherry", "orange", "kiwi", "melon", "mango"]

আমরা list-এর শুরু ও শেষের মানগুলোও বের করতে পারি, আর মাঝের সব মানকে একসাথে দলবদ্ধ করতে পারি:

>>> fruits = ["apple", "banana", "cherry", "orange", "kiwi", "melon", "mango"]
>>> x, *middle, y, z = fruits
>>> y
"melon"

>>> middle
["banana", "cherry", "orange", "kiwi"]

ডিপ আনপ্যাকিংয়েও আমরা * ব্যবহার করতে পারি:

>>> fruits_vegetables = [["apple", "banana", "melon"], ["carrot", "potato", "tomato"]]
>>> [[a, *rest], b] = fruits_vegetables
>>> a
"apple"

>>> rest
["banana", "melon"]

একটি ডিকশনারি আনপ্যাক করা

একটি ডিকশনারি আনপ্যাক করা একটি list/tuple আনপ্যাক করার চেয়ে একটু আলাদা। ডিকশনারির উপর ইটারেশন ডিফল্টভাবে কী (key)-এর উপর হয়। তাই একটি dict আনপ্যাক করার সময় আপনি শুধু কী (key) আনপ্যাক করতে পারেন, মান নয়:

>>> fruits_inventory = {"apple": 6, "banana": 2, "cherry": 3}
>>> x, y, z = fruits_inventory
>>> x
"apple"

যদি আপনি মানগুলো আনপ্যাক করতে চান, তাহলে <dict>.values() মেথড ব্যবহার করতে পারেন:

>>> fruits_inventory = {"apple": 6, "banana": 2, "cherry": 3}
>>> x, y, z = fruits_inventory.values()
>>> x
6

যদি কী (key) এবং মান দুটোই প্রয়োজন হয়, তাহলে <dict>.items() মেথড ব্যবহার করুন। <dict>.items() একটি ইটারেবল ভিউ তৈরি করে যাতে কী (key)-মান জোড়া থাকে। এগুলো একটি tuple-এ আনপ্যাক করা যায়:

>>> fruits_inventory = {"apple": 6, "banana": 2, "cherry": 3}
>>> x, y, z = fruits_inventory.items()
>>> x
("apple", 6)

প্যাকিং

প্যাকিং হলো একাধিক মানকে একটি list-এ দলবদ্ধ করে একটি ভ্যারিয়েবলে অ্যাসাইন করার সামর্থ্য। এটি তখন কাজে লাগে যখন আপনি মানগুলো আনপ্যাক করতে, পরিবর্তন করতে এবং তারপর ফলাফলগুলো আবার একটি ভ্যারিয়েবলে প্যাক করতে চান। এটি ২টি বা তার বেশি lists/tuples/dicts-এর উপর মার্জ করাও সম্ভব করে তোলে।

* দিয়ে একটি list/tuple প্যাক করা

* অপারেটর ব্যবহার করে একটি list/tuple প্যাক করা যায়। এটি সব মানকে একটি list/tuple-এ প্যাক করবে।

>>> fruits = ("apple", "banana", "cherry")
>>> more_fruits = ["orange", "kiwi", "melon", "mango"]

# fruits and more_fruits are unpacked and then their elements are packed into combined_fruits
>>> combined_fruits = *fruits, *more_fruits

# If there is no * on to the left of the "=" the result is a tuple
>>> combined_fruits
("apple", "banana", "cherry", "orange", "kiwi", "melon", "mango")

# If the * operator is used on the left side of "=" the result is a list.
# Note the trailing comma.
>>> *combined_fruits_too, = *fruits, *more_fruits
>>> combined_fruits_too
['apple', 'banana', 'cherry', 'orange', 'kiwi', 'melon', 'mango']

বাম দিকে * ব্যবহারের আরও পটভূমির জন্য PEP 3132 দেখুন।

** দিয়ে একটি ডিকশনারি প্যাক করা

** অপারেটর ব্যবহার করে একটি ডিকশনারি প্যাক করা হয়। এটি একটি ডিকশনারি থেকে সব কী (key)-মান জোড়া আরেকটি ডিকশনারিতে প্যাক করবে, অথবা দুটি ডিকশনারি একসাথে একত্রিত করবে।

>>> fruits_inventory = {"apple": 6, "banana": 2, "cherry": 3}
>>> more_fruits_inventory = {"orange": 4, "kiwi": 1, "melon": 2, "mango": 3}

# fruits_inventory and more_fruits_inventory are unpacked into key-values pairs and combined.
>>> combined_fruits_inventory = {**fruits_inventory, **more_fruits_inventory}

# then the pairs are packed into combined_fruits_inventory
>>> combined_fruits_inventory
{"apple": 6, "banana": 2, "cherry": 3, "orange": 4, "kiwi": 1, "melon": 2, "mango": 3}

ফাংশনের সাথে * এবং **-এর ব্যবহার

ফাংশনের প্যারামিটার দিয়ে প্যাকিং

যখন আপনি এমন একটি ফাংশন তৈরি করেন যা ইচ্ছামতো সংখ্যক আর্গুমেন্ট গ্রহণ করে, তখন ফাংশন ডেফিনিশনে আপনি *args বা **kwargs ব্যবহার করতে পারেন। *args ব্যবহার করা হয় ইচ্ছামতো সংখ্যক পজিশনাল (নন-কিওয়ার্ড) আর্গুমেন্ট একটি tuple হিসেবে প্যাক করতে, আর **kwargs ব্যবহার করা হয় ইচ্ছামতো সংখ্যক কিওয়ার্ড আর্গুমেন্ট একটি ডিকশনারি হিসেবে প্যাক করতে।

*args-এর ব্যবহার:

# This function is defined to take any number of positional arguments

>>> def my_function(*args):
...     print(args)

# Arguments given to the function are packed into a tuple

>>> my_function(1, 2, 3)
(1, 2, 3)

>>> my_function("Hello")
("Hello")

>>> my_function(1, 2, 3, "Hello", "Mars")
(1, 2, 3, "Hello", "Mars")

**kwargs-এর ব্যবহার:

# This function is defined to take any number of keyword arguments

>>> def my_function(**kwargs):
...   print(kwargs)

# Arguments given to the function are packed into a dictionary

>>> my_function(a=1, b=2, c=3)
{"a": 1, "b": 2, "c": 3}

*args এবং **kwargs একসাথে মিলিয়েও ব্যবহার করা যায়:

>>> def my_function(*args, **kwargs):
...   print(sum(args))
...   for key, value in kwargs.items():
...       print(str(key) + " = " + str(value))

>>> my_function(1, 2, 3, a=1, b=2, c=3)
6
a = 1
b = 2
c = 3

নির্দিষ্ট পজিশনাল আর্গুমেন্টের সুযোগ দিতে আপনি *args-এর আগে প্যারামিটারও লিখতে পারেন। তখন আলাদা আলাদা কিওয়ার্ড আর্গুমেন্ট **kwargs-এর আগে আসতে হবে।

Caution

আর্গুমেন্টগুলো সাজাতে হবে এভাবে:

def my_function(<positional_args>, *args, <key-word_args>, **kwargs)

যদি আপনি এই ক্রম অনুসরণ না করেন, তাহলে একটি এরর পাবেন।

>>> def my_function(a, b, *args):
...   print(a)
...   print(b)
...   print(args)

>>> my_function(1, 2, 3, 4, 5)
1
2
(3, 4, 5)

ভুল ক্রমে আর্গুমেন্ট লিখলে একটি এরর হবে:

>>>def my_function(*args, a, b):
... print(args)

>>>my_function(1, 2, 3, 4, 5)
Traceback (most recent call last):
  File "c:\something.py", line 3, in <module>
    my_function(1, 2, 3, 4, 5)
TypeError: my_function() missing 2 required keyword-only arguments: 'a' and 'b'

ফাংশন কলে আনপ্যাকিং

ফাংশন কলে আর্গুমেন্টের একটি list/tuple আনপ্যাক করতে আপনি * ব্যবহার করতে পারেন। এটি এমন ফাংশনের জন্য খুবই কাজে লাগে যেগুলো একটি iterable গ্রহণ করে না:

>>> def my_function(a, b, c):
...   print(c)
...   print(b)
...   print(a)

numbers = [1, 2, 3]
>>> my_function(*numbers)
3
2
1

zip() বিল্ট-ইন-এর সাথে * আনপ্যাকিং ব্যবহার করা আরেকটি কমন ব্যবহারের ক্ষেত্র। zip() ফাংশন একাধিক ইটারেবল নেয় এবং প্রতিটি iterable-এর মান দলবদ্ধ করে tuples-এর একটি list রিটার্ন করে:

>>> values = (['x', 'y', 'z'], [1, 2, 3], [True, False, True])
>>> a, *rest = zip(*values)
>>> rest
[('y', 2, False), ('z', 3, True)]

নির্দেশনা

আপনার বন্ধু লিনাস একজন লোকোমোটিভ ইঞ্জিনিয়ার, যিনি শহরগুলোর মধ্যে মালবাহী ট্রেন চালান। ট্রেন সামলাতে তিনি যতটা দুর্দান্ত, লজিস্টিকস বা কম্পিউটার সামলাতে ততটা নন। ট্রেনের খুঁটিনাটি তথ্য গুছিয়ে রাখতে এবং রুটের ডেটার ভুল সংশোধন করতে তিনি আপনার প্রোগ্রামিং সহায়তা নিতে চান।

Note

এই অনুশীলনীটি স্লাইসিং, ইনডেক্সিং এবং dict-এর বিভিন্ন মেথড দিয়ে সহজেই সমাধান করা যেত। তবে নিচের প্রতিটি কাজ সমাধান করার সময় প্যাকিং, আনপ্যাকিং এবং মাল্টিপল অ্যাসাইনমেন্ট অনুশীলন করাটাই আমরা চাই।

1. সব ওয়াগনের একটি অ্যারে তৈরি করুন

আপনার বন্ধু প্রতিটি ওয়াগনের আইডেন্টিফায়ার (ID) নজরে রেখে চলছেন, কিন্তু সিস্টেমকে নির্দিষ্ট কোনো সময়ে কতগুলো ওয়াগন প্রসেস করতে হবে তা তিনি কখনোই নিশ্চিত নন। এই ডেটা যদি একটি একক list-এ গুছিয়ে রাখা যায়, তাহলে বাকি লজিস্টিকস প্রোগ্রামের জন্য কাজ অনেক সহজ হয়ে যেত।

get_list_of_wagons() নামের একটি ফাংশন তৈরি করুন, যা যেকোনো সংখ্যক ওয়াগন আইডি গ্রহণ করে। প্রতিটি আইডি একটি ধনাত্মক ইন্টিজার হবে। এরপর ফাংশনটি প্রদত্ত আইডিগুলো একটি একক list হিসেবে return করবে।

>>> get_list_of_wagons(1, 7, 12, 3, 14, 8, 5)
[1, 7, 12, 3, 14, 8, 5]

2. ওয়াগনের অ্যারে ঠিক করুন

এই পর্যায়ে আপনি ডেটাটি সম্পর্কে এবং লজিস্টিকস প্রোগ্রামে এটি কীভাবে ব্যবহৃত হয় সে সম্পর্কে একটা ধারণা পেতে শুরু করেছেন। আইডি সিস্টেম সর্বদা লোকোমোটিভকে 1 আইডি দেয়, আর ট্রেনের বাকি ওয়াগনগুলোকে 1-এর চেয়ে বড় একটি এলোমেলোভাবে বাছাই করা আইডি দেয়।

আপনার বন্ধুকে ট্রেনে দুটি নতুন ওয়াগন জুড়তে হয়েছিল, কিন্তু সিস্টেম হালনাগাদ করতে ভুলে গেছেন! এখন ট্রেনের list-এ প্রথম দুটি ওয়াগনকে শেষে সরিয়ে নিতে হবে, নইলে সবকিছু এলোমেলো হয়ে যাবে।

বিষয়টা আরও জটিল করতে, আপনার বন্ধু এইমাত্র একটি দ্বিতীয় list খুঁজে পেয়েছেন, যাতে বাদ পড়া ওয়াগন আইডি আছে বলে মনে হচ্ছে। তিনি শুধু এটুকু মনে করতে পারছেন যে নতুন ওয়াগনগুলো সরানোর পর দ্বিতীয় list-এর আইডিগুলো নির্ধারিত লোকোমোটিভের ঠিক পরে বসাতে হবে।

আপনি তাঁর ভুলগুলো সংশোধন করে ডেটা একত্রিত করে দিলে লিনাস সত্যিই কৃতজ্ঞ হবেন।

fix_list_of_wagons() নামের একটি ফাংশন তৈরি করুন, যা ওয়াগন আইডি ধারণ করা দুটি list নেয়। এটি প্রথম list-এর প্রথম দুটি আইটেমকে শেষে সরিয়ে নেবে এবং দ্বিতীয় list-এর মানগুলো লোকোমোটিভ আইডি (1)-এর পিছনে (ডান দিকের) বসাবে। এরপর ফাংশনটি পরিবর্তনগুলোসহ একটি list return করবে।

>>> fix_list_of_wagons([2, 5, 1, 7, 4, 12, 6, 3, 13], [3, 17, 6, 15])
[1, 3, 17, 6, 15, 7, 4, 12, 6, 3, 13, 2, 5]

3. হারিয়ে যাওয়া স্টপ যোগ করুন

এখন সব ওয়াগনের ডেটা ঠিক আছে, তাই লিনাস চান আপনি সিস্টেমের রাউটিং তথ্য হালনাগাদ করুন। একটি পরিবহন রুটে ট্রেন মাল ওঠানো বা নামানোর জন্য কয়েকটি আলাদা স্টেশনে থামতে পারে। প্রতিটি যাত্রায় এই ধরনের মধ্যবর্তী ডেলিভারি পয়েন্টের সংখ্যা ভিন্ন হতে পারে। আপনার বন্ধু চান আপনি সিস্টেমের রাউটিং dict-এ অনুপস্থিত বা অতিরিক্ত ডেলিভারি তথ্য দিয়ে হালনাগাদ করুন।

add_missing_stops() নামের একটি ফাংশন তৈরি করুন, যা একটি রাউটিং dict-এর পরে পরিবর্তনশীল সংখ্যক কিওয়ার্ড আর্গুমেন্ট নেয়। এই আর্গুমেন্টগুলো একটি dict আকারে এক বা একাধিক স্টপ ধারণ করতে পারে, অথবা stop_number=city ধাঁচের যেকোনো সংখ্যক কিওয়ার্ড জোড়া হতে পারে। এরপর আপনার ফাংশনটি রাউটিং dict-টি একটি অতিরিক্ত key দিয়ে হালনাগাদ হয়ে রিটার্ন করবে, যেখানে ক্রমানুসারে যোগ করা সব স্টপের একটি list থাকবে।

>>> add_missing_stops({"from": "New York", "to": "Miami"},
                      stop_1="Washington, DC", stop_2="Charlotte", stop_3="Atlanta",
                      stop_4="Jacksonville", stop_5="Orlando")

{"from": "New York", "to": "Miami", "stops": ["Washington, DC", "Charlotte", "Atlanta", "Jacksonville", "Orlando"]}

4. রাউটিং তথ্য বাড়ান

লিনাস রাউটিং প্রোগ্রাম নিয়ে কাজ করছেন এবং লক্ষ্য করেছেন কিছু রুটে গুরুত্বপূর্ণ কিছু তথ্য অনুপস্থিত। প্রাথমিক রুট তথ্য একটি dict হিসেবে তৈরি করা হয়েছে, আর আপনার বন্ধু চান যা যা বাদ পড়েছে তা দিয়ে আপনি সেই dict হালনাগাদ করুন। সিস্টেমের প্রতিটি রুটে সামান্য ভিন্ন তথ্য লাগে, তাই লিনাস সত্যিই একটি জেনেরিক সমাধান পছন্দ করবেন।

extend_route_information() নামের একটি ফাংশন তৈরি করুন, যা দুটি dict নেয়। প্রথম dict-এ সেই উৎস ও গন্তব্য শহর থাকে, যার মধ্যে দিয়ে ট্রেনের রুট চলে।

দ্বিতীয় dict-এ ট্রেনের গতি, দৈর্ঘ্য বা তাপমাত্রার মতো অন্যান্য রুট-সংক্রান্ত তথ্য থাকে। ফাংশনটি সব রাউটিং তথ্যসহ একটি সংহত dict রিটার্ন করবে।

Note

উদাহরণে দেখানো প্রপার্টিগুলোর চেয়ে ভিন্ন বা বেশি প্রপার্টি দ্বিতীয় lists-এ থাকতে পারে।

>>> extend_route_information({"from": "Berlin", "to": "Hamburg"}, {"length": "100", "speed": "50"})
{"from": "Berlin", "to": "Hamburg", "length": "100", "speed": "50"}

5. ওয়াগন ডিপো ঠিক করুন

লিনাস যখন ওয়াগন ডিপো পরিদর্শন করছিলেন, তখন তিনি লক্ষ্য করলেন ওয়াগনগুলো সঠিক ক্রমে সংরক্ষণ হচ্ছে না। আইডি ছাড়াও প্রতিটি ওয়াগনের একটি রং থাকে, যা তার বহন করা মালের ধরনের সাথে মেলে। ডিপোতে ওয়াগনগুলো গ্রিডে সংরক্ষণ করা হয়, যেখানে গ্রিডের প্রতিটি কলামে একই রঙের ওয়াগন থাকে।

তবে লজিস্টিকস সিস্টেম দেখায়, ডিপোতে সংরক্ষণের জন্য দেওয়া ওয়াগনের lists-এ সারিগুলো রং অনুযায়ী দলবদ্ধ থাকে। কিন্তু সংরক্ষণ গ্রিডটি সঠিকভাবে কাজ করার জন্য প্রতিটি সারিতে তিনটি ভিন্ন রং থাকা দরকার, যাতে কলামগুলো রং অনুযায়ী মিলে যায়। আপনার বন্ধু চান আপনি ওয়াগন ডিপোর lists-গুলো গুছিয়ে দিন, যাতে ওয়াগনগুলো সঠিকভাবে সংরক্ষণ হয়।

fix_wagon_depot() নামের একটি ফাংশন তৈরি করুন, যা তিনটি আইটেমের একটি list নেয়। প্রতিটি list আইটেম হলো একটি সাবলিস্ট (বা "সারি"), যাতে তিনটি tuples থাকে। প্রতিটি tuple হলো একটি (<wagon ID>, <wagon color>) জোড়া।

আপনার ফাংশনটি একটি dicts রিটার্ন করবে, যেখানে তিনটি "সারি" lists এমনভাবে পুনর্বিন্যস্ত থাকবে যে ওয়াগনগুলো তাদের সঠিক অবস্থানে বদলে যায়।

>>> fix_wagon_depot([
                    [(2, "red"), (4, "red"), (8, "red")],
                    [(5, "blue"), (9, "blue"), (13,"blue")],
                    [(3, "orange"), (7, "orange"), (11, "orange")],
                    ])

[
[(2, "red"), (5, "blue"), (3, "orange")],
[(4, "red"), (9, "blue"), (7, "orange")],
[(8, "red"), (13,"blue"), (11, "orange")]
]
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Python Exercism

লোকোমোটিভ ইঞ্জিনিয়ার শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Python ট্র্যাকের 17টি কনসেপ্ট146টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।