अब तक के समाधान केवल सूचियों से संबंधित हैं, और अधिकांश सूची की प्रतिलिपि बना रहे हैं। मेरे अनुभव में बहुत बार ऐसा संभव नहीं है।
इसके अलावा, वे इस तथ्य से नहीं निपटते हैं कि आपके पास सूची में बार-बार तत्व हो सकते हैं।
आपके प्रश्न का शीर्षक " एक लूप के अंदर और अगले मूल्य " कहता है , लेकिन यदि आप एक लूप के अंदर अधिकांश उत्तर यहां चलाते हैं, तो आप इसे खोजने के लिए प्रत्येक तत्व पर फिर से पूरी सूची पर पुनरावृत्ति करेंगे।
इसलिए मैंने अभी एक फंक्शन बनाया है। 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
इसके अंत में करने के लिए किया जाता है
- अब 3 स्वतंत्र क्रम हैं
some_iterable
जो इस तरह दिखते हैं:
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
- स्रोत