লিস্টের প্রতিটি এলিমেন্টের আগের এবং পরের এলিমেন্ট (adjacent elements) বের করার জন্য enumerate() এবং কন্ডিশনাল লজিক ব্যবহার করা হয়। প্রথম এবং শেষ এলিমেন্টের জন্য একপাশে None থাকে।
উদাহরণ
def get_adjacent_elements(lst):
"""প্রতিটি এলিমেন্টের (পূর্ববর্তী, পরবর্তী) টাপল রিটার্ন করে"""
result = []
for i, val in enumerate(lst):
if i == 0:
# প্রথম এলিমেন্ট: পূর্ববর্তী নেই
result.append((None, lst[i + 1]))
elif i == len(lst) - 1:
# শেষ এলিমেন্ট: পরবর্তী নেই
result.append((lst[i - 1], None))
else:
# মাঝপথি এলিমেন্ট: দুই পাশে আছে
result.append((lst[i - 1], lst[i + 1]))
return result
my_list = [13, 37, 58, 12, 41, 25, 48, 19, 23]
print("লিস্ট:", my_list)
adjacent = get_adjacent_elements(my_list)
print("আপ পাশের এলিমেন্ট:")
for i, (prev, nxt) in enumerate(adjacent):
print(f" ইন্ডেক্স {i} ({my_list[i]}): পূর্ববর্তী={prev}, পরবর্তী={nxt}")
আউটপুট
লিস্ট: [13, 37, 58, 12, 41, 25, 48, 19, 23]
আপ পাশের এলিমেন্ট:
ইন্ডেক্স ০ (13): পূর্ববর্তী=None, পরবর্তী=37
ইন্ডেক্স ১ (37): পূর্ববর্তী=13, পরবর্তী=58
ইন্ডেক্স ২ (58): পূর্ববর্তী=37, পরবর্তী=12
ইন্ডেক্স ৩ (12): পূর্ববর্তী=58, পরবর্তী=41
ইন্ডেক্স ৪ (41): পূর্ববর্তী=12, পরবর্তী=25
ইন্ডেক্স ৫ (25): পূর্ববর্তী=41, পরবর্তী=48
ইন্ডেক্স ৬ (48): পূর্ববর্তী=25, পরবর্তী=19
ইন্ডেক্স ৭ (19): পূর্ববর্তী=48, পরবর্তী=23
ইন্ডেক্স ৮ (23): পূর্ববর্তী=19, পরবর্তী=None
zip দিয়ে পাইথনিক সংস্করণ
def get_adjacent_zip(lst):
# পূর্ববর্তী: None + lst[:-1]
# পরবর্তী: lst[1:] + None
prev = [None] + lst[:-1]
nxt = lst[1:] + [None]
return list(zip(prev, nxt))
print(get_adjacent_zip(my_list))
# [(None, 37), (13, 58), (37, 12), (58, 41), (12, 25), (41, 48), (25, 19), (48, 23), (19, None)]
NumPy roll ব্যবহার (দ্রুত)
import numpy as np
arr = np.array(my_list)
prev = np.roll(arr, 1)
nxt = np.roll(arr, -1)
prev[0] = None # বা np.nan
nxt[-1] = None
adjacent = list(zip(prev, nxt))
ব্যবহারিক ক্ষেত্র
- টাইম সিরিজ: আগের/পরের টাইমস্টেপ বের করা
- গ্রাফ ট্রাভার্সাল: নেইবারের সনাক্তকরণ
- সিগন্যাল প্রসেসিং: ডিফারেন্স ক্যালকুলেশন