সমাধান এখন পর্যন্ত কেবল তালিকার সাথে কাজ করে এবং বেশিরভাগই তালিকাটি অনুলিপি করছে। আমার অভিজ্ঞতায় অনেক সময় সম্ভব হয় না।
এছাড়াও, তারা তালিকায় আপনার পুনরাবৃত্ত উপাদান থাকতে পারে এই বিষয়টি নিয়ে তারা আপত্তি জানায় না।
আপনার প্রশ্নের শিরোনামটি " একটি লুপের অভ্যন্তরীণ পূর্ববর্তী এবং পরবর্তী মানগুলি " বলে, তবে আপনি যদি এখানে বেশিরভাগ উত্তর একটি লুপের মধ্যে চালান, আপনি এটি সন্ধানের জন্য প্রতিটি উপাদানটিতে আবার পুরো তালিকাটি পুনরাবৃত্তি করে শেষ করতে পারেন।
সুতরাং আমি সবেমাত্র একটি ফাংশন তৈরি করেছি যে। itertools
মডিউলটি ব্যবহার করে , পুনরাবৃত্তিযোগ্য এবং টুকরো টুকরো টুকরো টুকরো করে এবং পূর্ববর্তী এবং পরবর্তী উপাদানগুলির সাথে একত্রে টিপলস তৈরি করে। আপনার কোডটি ঠিক কী করে তা নয়, তবে এটি একবার দেখার মতো, কারণ এটি সম্ভবত আপনার সমস্যার সমাধান করতে পারে।
from itertools import tee, islice, chain, izip
def previous_and_next(some_iterable):
prevs, items, nexts = tee(some_iterable, 3)
prevs = chain([None], prevs)
nexts = chain(islice(nexts, 1, None), [None])
return izip(prevs, items, nexts)
তারপরে এটি একটি লুপে ব্যবহার করুন এবং এতে আপনার আগের এবং পরবর্তী আইটেমগুলি থাকবে:
mylist = ['banana', 'orange', 'apple', 'kiwi', 'tomato']
for previous, item, nxt in previous_and_next(mylist):
print "Item is now", item, "next is", nxt, "previous is", previous
ফলাফলগুলো:
Item is now banana next is orange previous is None
Item is now orange next is apple previous is banana
Item is now apple next is kiwi previous is orange
Item is now kiwi next is tomato previous is apple
Item is now tomato next is None previous is kiwi
এটি কোনও আকারের তালিকা (কারণ এটি তালিকার অনুলিপি করে না) এবং কোনও পুনরাবৃত্ত (ফাইল, সেট, ইত্যাদি) সহ কাজ করবে। এইভাবে আপনি কেবল ক্রমটি পুনরাবৃত্তি করতে পারেন এবং লুপের ভিতরে পূর্ববর্তী এবং পরবর্তী আইটেমগুলি উপলভ্য করতে পারেন। ক্রমের আইটেমটির জন্য আবার অনুসন্ধান করার দরকার নেই।
কোডটির একটি সংক্ষিপ্ত ব্যাখ্যা:
tee
ইনপুট ক্রম উপর দক্ষতার সাথে 3 স্বতন্ত্র পুনরাবৃত্তি তৈরি করতে ব্যবহৃত হয়
chain
একটিতে দুটি সিকোয়েন্স যুক্ত; এটি এখানে একটি একক উপাদান ক্রম সংযোজন করতে ব্যবহার করা [None]
হয়prevs
islice
প্রথম ব্যতীত সব উপাদান একটি ক্রম করতে ব্যবহার করা হয়, তাহলে chain
একটি সংযোজন করতে ব্যবহৃত হয় None
তার শেষ
- এই
some_iterable
চেহারাটির উপর ভিত্তি করে 3 টি স্বতন্ত্র সিকোয়েন্স রয়েছে :
prevs
: None, A, B, C, D, E
items
: A, B, C, D, E
nexts
: B, C, D, E, None
- অবশেষে
izip
3 টি সিকোয়েন্সকে ট্রিপল্টের এক সিকোয়েন্সে পরিবর্তন করতে ব্যবহৃত হয়।
নোট করুন যে izip
কোনও ইনপুট ক্রম শেষ হয়ে গেলে থামবে, সুতরাং এর সর্বশেষ উপাদানটি prevs
উপেক্ষা করা হবে, যা সঠিক - শেষ উপাদানটি এর মতো হবে এমন কোনও উপাদান নেই prev
। আমরা শেষ উপাদানগুলি থেকে সরিয়ে ফেলার চেষ্টা করতে পারি prevs
তবে izip
এর আচরণ সেই অপ্রয়োজনীয় করে তোলে
এছাড়াও মনে রাখবেন tee
, izip
, islice
এবং chain
থেকে আসা itertools
মডিউল; তারা ফ্লাইটে (লাসি) তাদের ইনপুট সিকোয়েন্সগুলিতে পরিচালনা করে, যা তাদের দক্ষ করে তোলে এবং যে কোনও সময়ে একবারে স্মৃতিতে পুরো ক্রমটি রাখার প্রয়োজনীয়তার পরিচয় দেয় না।
ইন python 3
, এটি আমদানির সময় একটি ত্রুটি দেখাবে izip
, আপনি এর zip
পরিবর্তে ব্যবহার করতে পারেন izip
। আমদানি করার কোন প্রয়োজন নেই zip
, এটা পূর্বনির্ধারিত হয় python 3
- উৎস