কম্পিউটার টিউটোরিয়াল

পাইথন: স্ট্রিং লিস্ট থেকে কনসেকিউটিভ সিমিলার এলিমেন্টের রেঞ্জ বের করা

এক লিস্টে একে після একে একই মান আবির্ভূত হলে (consecutive duplicates), সেগুলোর শুরুর ইন্ডেক্স, শেষ ইন্ডেক্স এবং মান বের করার জন্য হাইল লুপ ব্যবহার করা হয়।

উদাহরণ


my_list = [12, 23, 23, 23, 48, 48, 36, 17, 17]
print("লিস্ট:", my_list)

result = []
i = 0
while i < len(my_list):
    start = i
    val = my_list[i]
    # একই মান চলতে থাকলে ইনডেক্স বাড়ানো
    while i < len(my_list) and my_list[i] == val:
        i += 1
    end = i - 1
    result.append((val, start, end))

print("কনসেকিউটিভ রেঞ্জ:")
for val, start, end in result:
    print(f"  মান {val}: ইন্ডেক্স {start} থেকে {end}")

আউটপুট


লিস্ট: [12, 23, 23, 23, 48, 48, 36, 17, 17]
কনসেকিউটিভ রেঞ্জ:
  মান 12: ইন্ডেক্স 0 থেকে 0
  মান 23: ইন্ডেক্স 1 থেকে 3
  মান 48: ইন্ডেক্স 4 থেকে 5
  মান 36: ইন্ডেক্স 6 থেকে 6
  মান 17: ইন্ডেক্স 7 থেকে 8

ব্যাখ্যা

  • বায়ের while লুপ — প্রতিটি নতুন গ্রুপের শুরু
  • ভেতরের while লুপ — একই মান চলতে থাকলে ইনডেক্স বাড়ায়
  • (val, start, end) টাপল হিসেবে সংরক্ষণ

itertools.groupby ব্যবহার (সুপারিশকৃত)


from itertools import groupby

result = []
for val, group in groupby(enumerate(my_list), key=lambda x: x[1]):
    indices = [idx for idx, _ in group]
    result.append((val, indices[0], indices[-1]))

print(result)
# [(12, 0, 0), (23, 1, 3), (48, 4, 5), (36, 6, 6), (17, 7, 8)]

groupby কনসেকিউটিভ একই ভ্যালুগুলোকে অটোমেটিক গ্রুপ করে, কোড ছোট ও পঠনযোগ্য হয়।

পandas-এ রান-লেংথ এনকোডিং


import pandas as pd
s = pd.Series(my_list)
# কনসেকিউটিভ গ্রুপ আইডি
groups = (s != s.shift()).cumsum()
# গ্রুপবাই করে ফirse/last ইন্ডেক্স
ranges = s.groupby(groups).agg(['first', 'last', lambda x: x.index[0], lambda x: x.index[-1]])
  1. পাইথনে লিস্টে অনুপস্থিত উপাদানগুলো খুঁজে বের করা

  2. পাইথনে লিস্টে ক্রমাগত এলিমেন্ট জোড়া 만들기

  3. পাইথনে লিস্টে রেঞ্জ অফ এলিমেন্ট অ্যাসাইন করুন

  4. পাইথনে রেঞ্জের মধ্যে এলিমেন্ট ডিলিট করুন