यदि आप स्वतंत्र रूप से दूसरे से एक इटेटरेटर का उपभोग करना चाहते हैं, तो स्मृति में सामान खींचने से बचने का कोई तरीका नहीं है, क्योंकि एक पुनरावर्तक प्रगति करेगा जबकि दूसरा (और इसलिए बफर करना होगा)।
कुछ इस तरह आप दोनों 'छोड़ दिया आइटम' और जोड़े की 'सही आइटम' पर चीज़ों को दोहरा सकते:
import itertools
import operator
it1, it2 = itertools.tee(xys)
xs = map(operator.itemgetter(0), it1))
ys = map(operator.itemgetter(1), it2))
print(next(xs))
print(next(ys))
... लेकिन यह ध्यान रखें कि यदि आप केवल एक इटरेटर उपभोग करते हैं, जब तक आप उन्हें उपभोग शुरू नहीं करेंगे तब तक अन्य स्मृति में आइटम बफर करेंगे।
(Btw, पायथन 3. यह सोचते हैं अजगर 2 में आप itertools.imap()
, नहीं map()
उपयोग करने के लिए की जरूरत है।)
स्रोत
2015-06-12 14:09:36
_ "जोड़े xys की एक सूची दी गई" _ तो कुछ '[(1,2), (2,3), (3,4), ...] '? आपको इसे ज़िप करने की आवश्यकता नहीं है; यह पहले से ही tuples की सूची (या iterator) है। –
मैं xys को दो अलग इटरेटर्स xs = [1,2,3, ...] और ys = [2,3,4, ...] –
में परिवर्तित करना चाहता हूं तो xys कुछ है [[1,2, 3], [2,3,4]] '? फिर 'itertools.izip' वह है जो आप चाहते हैं। यह सूचियों की एक जोड़ी है, जो जोड़ों की सूची नहीं है। –