2017-02-09 12 views
6

पायथन में मैंने असाइनमेंट का उपयोग करने के साथ अपने इटरेटर की एक प्रति बनाने की कोशिश की, हालांकि यह इटेटरेटर की एक प्रतिलिपि बनाता है जो मूल इटरेटर के संदर्भ में है। उदाहरण के लिए:पायथन इटरेटर की एक प्रति कैसे बनाएं?

my_list = [5, 4, 3,2] 
first_it = iter(my_list) 
second_it = first_it 
print next(first_it)  #it will print 5 
print next(second_it)  #it will print 4 
print next(first_it)  #it will print 3 

आप उदाहरण first_it में देख सकते हैं और second_it दोनों एक ही इटरेटर वस्तु का उल्लेख है। क्या यह इटरेटर ऑब्जेक्ट की एक प्रति बनाना संभव है जो मूल ऑब्जेक्ट का संदर्भ नहीं है?

नोट यह सवाल कैसे मान द्वारा इटरेटर ऑब्जेक्ट की प्रति बनाने के बारे में है। इसलिए समाधान की तरह for item in my_list: का उल्लेख न करें।
अग्रिम धन्यवाद

उत्तर

9

प्रतियां बनाने के लिए itertools.tee() function का उपयोग करें; इन विभिन्न iterators के बीच परिणामों को साझा करने के लिए एक बफर का उपयोग करें:

from itertools import tee 

my_list = [5, 4, 3,2] 
first_it = iter(my_list) 
first_it, second_it = tee(first_it) 
print next(first_it) # prints 5 
print next(second_it) # prints 5 
print next(first_it) # prints 4 

नोट है कि आप अब मूल इटरेटर का उपयोग करना चाहिए; केवल टीज़ का प्रयोग करें।

ध्यान दें कि बफर का यह भी अर्थ है कि यदि आप दूसरों की तुलना में प्रतियों में से एक को आगे बढ़ाते हैं तो इन्हें महत्वपूर्ण मेमोरी लागत लग सकती है! प्रलेखन से:

इस इटरेटोल को महत्वपूर्ण सहायक भंडारण की आवश्यकता हो सकती है (इस पर निर्भर करता है कि कितना अस्थायी डेटा संग्रहीत करने की आवश्यकता है)। आम तौर पर, यदि एक पुनरावर्तक किसी अन्य पुनरावर्तक से पहले अधिकांश या सभी डेटा का उपयोग करता है, तो tee() के बजाय list() का उपयोग करना तेज़ है।

+0

मैंने 'copy.copy()' के साथ प्रयास किया और यह भी काम किया। शायद एक छिपी हुई पकड़ है? –

+2

@ जीन-फ्रैंकोइसफैबर: यह जनरेटर के लिए काम नहीं करेगा। एक जनरेटर के साथ प्रयास करें जो 'सत्य के दौरान उपयोग करता है: उदाहरण के लिए random.random() 'उपज। –

+0

से संबंधित: "आप जनरेटर नहीं चुन सकते हैं" शायद। –

संबंधित मुद्दे