পাইথন তালিকা বোঝার স্বরলিপি ব্যবহার করে

ব্যবসায়

পাইথনে, একটি নতুন তালিকা তৈরি করার সময় তালিকা বোঝার স্বরলিপি ব্যবহার করা সহজ।(List comprehensions)

এই নিবন্ধে, আমরা প্রথমে নিম্নলিখিত আলোচনা করব

  • মৌলিক ধরনের তালিকা বোঝার স্বরলিপি
  • যদি দ্বারা শর্তসাপেক্ষ শাখার সঙ্গে বোঝার স্বরলিপি তালিকা
  • টারনারি অপারেটরদের সাথে সমন্বয় (যদি অন্যরকম প্রক্রিয়াকরণ হয়)
  • zip(),enumerate()এগুলোর সাথে সমন্বয়
  • নেস্টেড তালিকা অন্তর্ভুক্তি স্বরলিপি

এর পরে, আমরা নমুনা কোড সহ তালিকা বোঝার স্বরলিপির সেট ব্যাখ্যা করব।

  • সেট অন্তর্ভুক্তি স্বরলিপি(Set comprehensions)
  • অভিধান অন্তর্ভুক্তি স্বরলিপি(Dict comprehensions)
  • জেনারেটরের ধরন(Generator expressions)

মৌলিক ধরনের তালিকা বোঝার স্বরলিপি

তালিকা বোঝার স্বরলিপি নিম্নরূপ লেখা হয়।

[Expression for Any Variable Name in Iterable Object]

এটি একটি পুনরাবৃত্ত বস্তুর প্রতিটি উপাদান যেমন একটি তালিকা, টিপল, বা একটি ইচ্ছামত পরিবর্তনশীল নাম দ্বারা পরিসীমা নেয় এবং একটি অভিব্যক্তি দিয়ে এটি মূল্যায়ন করে। একটি উপাদান হিসাবে মূল্যায়ন ফলাফল সহ একটি নতুন তালিকা ফিরে আসে।

বিবৃতির জন্য একটি সমতুল্য সহ একটি উদাহরণ দেওয়া হয়েছে।

squares = [i**2 for i in range(5)]
print(squares)
# [0, 1, 4, 9, 16]
squares = []
for i in range(5):
    squares.append(i**2)

print(squares)
# [0, 1, 4, 9, 16]

একই প্রক্রিয়া ম্যাপ() দিয়ে করা যেতে পারে, তবে তালিকা বোঝার স্বরলিপি তার সরলতা এবং স্বচ্ছতার জন্য পছন্দ করা হয়।

যদি দ্বারা শর্তসাপেক্ষ শাখার সঙ্গে বোঝার স্বরলিপি তালিকা

যদি সম্ভব হয় সঙ্গে শর্তসাপেক্ষ শাখা. নিচের মত করে পোস্টফিক্সে if লিখুন।

[Expression for Any Variable Name in Iterable Object if Conditional Expression]

শুধুমাত্র পুনরাবৃত্তিযোগ্য বস্তুর উপাদান যার শর্তসাপেক্ষ অভিব্যক্তি সত্য, অভিব্যক্তি দ্বারা মূল্যায়ন করা হয় এবং একটি নতুন তালিকা যার উপাদানগুলি ফলাফল প্রদান করে।

আপনি শর্তসাপেক্ষ অভিব্যক্তিতে যেকোনো পরিবর্তনশীল নাম ব্যবহার করতে পারেন।

বিবৃতির জন্য একটি সমতুল্য সহ একটি উদাহরণ দেওয়া হয়েছে।

odds = [i for i in range(10) if i % 2 == 1]
print(odds)
# [1, 3, 5, 7, 9]
odds = []
for i in range(10):
    if i % 2 == 1:
        odds.append(i)

print(odds)
# [1, 3, 5, 7, 9]

একই প্রক্রিয়া ফিল্টার() দিয়ে করা যেতে পারে, তবে তালিকা বোঝার স্বরলিপি তার সরলতা এবং স্বচ্ছতার জন্য পছন্দ করা হয়।

টারনারি অপারেটরদের সাথে সমন্বয় (যদি অন্যরকম প্রক্রিয়াকরণ হয়)

উপরের উদাহরণে, শুধুমাত্র সেই উপাদানগুলিকে প্রক্রিয়া করা হয় যা মানদণ্ড পূরণ করে এবং যেগুলি মানদণ্ড পূরণ করে না সেগুলিকে নতুন তালিকা থেকে বাদ দেওয়া হয়৷

আপনি যদি শর্তের উপর নির্ভর করে প্রক্রিয়াটি পরিবর্তন করতে চান, বা আপনি যদি এমন উপাদানগুলিকে প্রক্রিয়া করতে চান যেগুলি শর্তকে ভিন্নভাবে সন্তুষ্ট করে না, যেমন অন্যভাবে, টারনারি অপারেটর ব্যবহার করুন।

পাইথনে, টারনারি অপারেটরটি নিম্নরূপ লেখা যেতে পারে

Value When True if Conditional Expression else Value When False

এটি নীচে দেখানো হিসাবে তালিকা বোঝার স্বরলিপির এক্সপ্রেশন অংশে ব্যবহৃত হয়।

[Value When True if Conditional Expression else Value When False for Any Variable Name in Iterable Object]

বিবৃতির জন্য একটি সমতুল্য সহ একটি উদাহরণ দেওয়া হয়েছে।

odd_even = ['odd' if i % 2 == 1 else 'even' for i in range(10)]
print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
odd_even = []
for i in range(10):
    if i % 2 == 1:
        odd_even.append('odd')
    else:
        odd_even.append('even')

print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']

সত্য এবং মিথ্যা মানগুলির জন্য নির্বিচারে পরিবর্তনশীল নাম ব্যবহার করে অভিব্যক্তি লেখাও সম্ভব।

শর্ত সন্তুষ্ট হলে, কিছু প্রক্রিয়াকরণ করা হয়, অন্যথায় মূল পুনরাবৃত্তিযোগ্য বস্তুর মান অপরিবর্তিত রাখা হয়।

odd10 = [i * 10 if i % 2 == 1 else i for i in range(10)]
print(odd10)
# [0, 10, 2, 30, 4, 50, 6, 70, 8, 90]

zip() এবং enumerate() এর সাথে সমন্বয়

দরকারী ফাংশনগুলি যা প্রায়শই for স্টেটমেন্টে ব্যবহৃত হয় তার মধ্যে রয়েছে zip(), যা একাধিক পুনরাবৃত্তিযোগ্য এবং enumerate(), যা তার সূচকের সাথে একটি মান প্রদান করে।

অবশ্যই, তালিকা বোঝার স্বরলিপি সহ zip() এবং enumerate() ব্যবহার করা সম্ভব। এটি একটি বিশেষ সিনট্যাক্স নয়, এবং আপনি যদি ফর স্টেটমেন্টের সাথে চিঠিপত্র বিবেচনা করেন তবে এটি কঠিন নয়।

জিপ() এর উদাহরণ।

l_str1 = ['a', 'b', 'c']
l_str2 = ['x', 'y', 'z']

l_zip = [(s1, s2) for s1, s2 in zip(l_str1, l_str2)]
print(l_zip)
# [('a', 'x'), ('b', 'y'), ('c', 'z')]
l_zip = []
for s1, s2 in zip(l_str1, l_str2):
    l_zip.append((s1, s2))

print(l_zip)
# [('a', 'x'), ('b', 'y'), ('c', 'z')]

গণনা () এর উদাহরণ।

l_enu = [(i, s) for i, s in enumerate(l_str1)]
print(l_enu)
# [(0, 'a'), (1, 'b'), (2, 'c')]
l_enu = []
for i, s in enumerate(l_str1):
    l_enu.append((i, s))

print(l_enu)
# [(0, 'a'), (1, 'b'), (2, 'c')]

যদি ব্যবহার করার সময় ধারণাটি আগের মতোই থাকে।

l_zip_if = [(s1, s2) for s1, s2 in zip(l_str1, l_str2) if s1 != 'b']
print(l_zip_if)
# [('a', 'x'), ('c', 'z')]

প্রতিটি উপাদান একটি নতুন উপাদান গণনা করতে ব্যবহার করা যেতে পারে।

l_int1 = [1, 2, 3]
l_int2 = [10, 20, 30]

l_sub = [i2 - i1 for i1, i2 in zip(l_int1, l_int2)]
print(l_sub)
# [9, 18, 27]

নেস্টেড তালিকা অন্তর্ভুক্তি স্বরলিপি

লুপগুলির জন্য নেস্টিংয়ের মতো, তালিকা বোঝার স্বরলিপিও নেস্ট করা যেতে পারে।

[Expression for Variable Name 1 in Iterable Object 1
    for Variable Name 2 in Iterable Object 2
        for Variable Name 3 in Iterable Object 3 ... ]

সুবিধার জন্য, লাইন ব্রেক এবং ইনডেন্টেশন যোগ করা হয়েছে, কিন্তু ব্যাকরণের জন্য প্রয়োজন নেই; তারা একটি একক লাইনে চালিয়ে যেতে পারে।

বিবৃতির জন্য একটি সমতুল্য সহ একটি উদাহরণ দেওয়া হয়েছে।

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

flat = [x for row in matrix for x in row]
print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
flat = []
for row in matrix:
    for x in row:
        flat.append(x)

print(flat)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

একাধিক ভেরিয়েবল ব্যবহার করাও সম্ভব।

cells = [(row, col) for row in range(3) for col in range(2)]
print(cells)
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

আপনি শর্তসাপেক্ষ শাখাও করতে পারেন।

cells = [(row, col) for row in range(3)
         for col in range(2) if col == row]
print(cells)
# [(0, 0), (1, 1)]

প্রতিটি পুনরাবৃত্তিযোগ্য বস্তুর জন্য শর্তসাপেক্ষে শাখা করাও সম্ভব।

cells = [(row, col) for row in range(3) if row % 2 == 0
         for col in range(2) if col % 2 == 0]
print(cells)
# [(0, 0), (2, 0)]

সেট অন্তর্ভুক্তি স্বরলিপি(Set comprehensions)

বর্গাকার বন্ধনী [] লিস্ট কম্প্রিহেনশন নোটেশনে কোঁকড়া বন্ধনীতে পরিবর্তন করা {} একটি সেট (সেট-টাইপ অবজেক্ট) তৈরি করে।

{Expression for Any Variable Name in Iterable Object}
s = {i**2 for i in range(5)}

print(s)
# {0, 1, 4, 9, 16}

অভিধান অন্তর্ভুক্তি স্বরলিপি(Dict comprehensions)

ডিকশনারি (ডিক্ট টাইপ অবজেক্ট) বোঝার স্বরলিপি দিয়েও তৈরি করা যেতে পারে।

{}, এবং অভিব্যক্তি অংশে কী এবং মানটিকে কী হিসাবে নির্দিষ্ট করুন: মান।

{Key: Value for Any Variable Name in Iterable Object}

কী এবং মানের জন্য যেকোন এক্সপ্রেশন নির্দিষ্ট করা যেতে পারে।

l = ['Alice', 'Bob', 'Charlie']

d = {s: len(s) for s in l}
print(d)
# {'Alice': 5, 'Bob': 3, 'Charlie': 7}

কী এবং মানের তালিকা থেকে একটি নতুন অভিধান তৈরি করতে, zip() ফাংশন ব্যবহার করুন।

keys = ['k1', 'k2', 'k3']
values = [1, 2, 3]

d = {k: v for k, v in zip(keys, values)}
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

জেনারেটরের ধরন(Generator expressions)

যদি বর্গাকার বন্ধনী [] তালিকা বোধগম্য স্বরলিপি বৃত্তাকার বন্ধনী হিসাবে ব্যবহার করা হয় (), একটি জেনারেটর একটি tuple পরিবর্তে ফেরত দেওয়া হয়. একে জেনারেটর এক্সপ্রেশন বলা হয়।

তালিকা বোঝার স্বরলিপির উদাহরণ।

l = [i**2 for i in range(5)]

print(l)
# [0, 1, 4, 9, 16]

print(type(l))
# <class 'list'>

জেনারেটর এক্সপ্রেশনের উদাহরণ। আপনি যদি জেনারেটরটিকে প্রিন্ট() করেন তবে এটি এর বিষয়বস্তু প্রিন্ট করবে না, তবে আপনি যদি একটি ফর স্টেটমেন্ট দিয়ে এটি চালান তবে আপনি বিষয়বস্তু পেতে পারেন।

g = (i**2 for i in range(5))

print(g)
# <generator object <genexpr> at 0x10af944f8>

print(type(g))
# <class 'generator'>

for i in g:
    print(i)
# 0
# 1
# 4
# 9
# 16

জেনারেটর এক্সপ্রেশনগুলি শর্তসাপেক্ষ শাখা এবং নেস্টিংয়ের অনুমতি দেয় যদি সেইসাথে তালিকা বোঝার স্বরলিপি ব্যবহার করে।

g_cells = ((row, col) for row in range(0, 3)
           for col in range(0, 2) if col == row)

print(type(g_cells))
# <class 'generator'>

for i in g_cells:
    print(i)
# (0, 0)
# (1, 1)

উদাহরণ স্বরূপ, যদি লিস্ট কম্প্রিহেনশন স্বরলিপি ব্যবহার করে প্রচুর সংখ্যক উপাদান সহ একটি তালিকা তৈরি করা হয় এবং তারপরে একটি ফর স্টেটমেন্ট দিয়ে লুপ করা হয়, যদি তালিকা বোঝার স্বরলিপি ব্যবহার করা হয় তবে সমস্ত উপাদান ধারণকারী তালিকাটি শুরুতে তৈরি হবে। অন্যদিকে, যদি আপনি একটি জেনারেটর এক্সপ্রেশন ব্যবহার করেন, প্রতিবার লুপ পুনরাবৃত্তি করা হলে উপাদানগুলি একে একে উৎপন্ন হয়, এইভাবে ব্যবহৃত মেমরির পরিমাণ হ্রাস করে।

যদি জেনারেটর এক্সপ্রেশনটি ফাংশনের একমাত্র যুক্তি হয় তবে বৃত্তাকার বন্ধনী () বাদ দেওয়া যেতে পারে।

print(sum([i**2 for i in range(5)]))
# 30

print(sum((i**2 for i in range(5))))
# 30

print(sum(i**2 for i in range(5)))
# 30

প্রক্রিয়াকরণের গতির জন্য, তালিকা বোঝার স্বরলিপি প্রায়শই জেনারেটর স্বরলিপির চেয়ে দ্রুত হয় যখন সমস্ত উপাদান প্রক্রিয়া করা হয়।

যাইহোক, যখন all() বা any() দিয়ে বিচার করা হয়, উদাহরণস্বরূপ, ফলাফল নির্ণয় করা হয় যখন মিথ্যা বা সত্য উপস্থিত থাকে, তাই জেনারেটর এক্সপ্রেশন ব্যবহার করা তালিকা বোঝার স্বরলিপি ব্যবহার করার চেয়ে দ্রুত হতে পারে।

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

t = tuple(i**2 for i in range(5))

print(t)
# (0, 1, 4, 9, 16)

print(type(t))
# <class 'tuple'>
Copied title and URL