এক লিস্টে একে після একে একই মান আবির্ভূত হলে (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]])