2015-06-12 8 views
7

जोड़े xys की एक सूची को देखते हुए, दो सूचियों में अनज़िप करने के लिए अजगर मुहावरा है:एक पुनरावर्तक को कैसे अनजिप करें?

xs, ys = zip(*xys) 

तो xys पुनरावर्तक है, मैं इसे कैसे दो iterators में अनज़िप कर सकते हैं स्मृति में सब कुछ भंडारण के बिना,?

+0

_ "जोड़े xys की एक सूची दी गई" _ तो कुछ '[(1,2), (2,3), (3,4), ...] '? आपको इसे ज़िप करने की आवश्यकता नहीं है; यह पहले से ही tuples की सूची (या iterator) है। –

+1

मैं xys को दो अलग इटरेटर्स xs = [1,2,3, ...] और ys = [2,3,4, ...] –

+0

में परिवर्तित करना चाहता हूं तो xys कुछ है [[1,2, 3], [2,3,4]] '? फिर 'itertools.izip' वह है जो आप चाहते हैं। यह सूचियों की एक जोड़ी है, जो जोड़ों की सूची नहीं है। –

उत्तर

4

मान लीजिए आप जोड़े में से कुछ iterable है:

a = zip(range(10), range(10)) 

अगर मैं सही ढंग की व्याख्या कर रहा हूँ क्या आप के लिए पूछ रहे हैं, तो आप itertools.tee का उपयोग कर बातें पहली बार और सेकंड के लिए स्वतंत्र iterators उत्पन्न कर सकता है:

xs, ys = itertools.tee(a) 
xs, ys = (x[0] for x in xs), (y[1] for y in ys) 

नोट यह स्मृति में "अंतर" को याद रखेगा कि आप उनमें से एक को बनाम बनाते हैं।

6

यदि आप स्वतंत्र रूप से दूसरे से एक इटेटरेटर का उपभोग करना चाहते हैं, तो स्मृति में सामान खींचने से बचने का कोई तरीका नहीं है, क्योंकि एक पुनरावर्तक प्रगति करेगा जबकि दूसरा (और इसलिए बफर करना होगा)।

कुछ इस तरह आप दोनों 'छोड़ दिया आइटम' और जोड़े की 'सही आइटम' पर चीज़ों को दोहरा सकते:

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() उपयोग करने के लिए की जरूरत है।)

+1

दरअसल [डॉक्स] (https://docs.python.org/2/library/itertools.html#itertools.tee) इस पर एक चेतावनी है: * "इस इटारेटोल को महत्वपूर्ण सहायक भंडारण की आवश्यकता हो सकती है (कितना अस्थायी है डेटा को संग्रहीत करने की आवश्यकता है) सामान्य रूप से, यदि एक पुनरावर्तक किसी अन्य पुनरावर्तक से पहले अधिकतर या सभी डेटा का उपयोग करता है, तो 'tee()' के बजाय 'सूची() 'का उपयोग करना तेज़ है। * – jonrsharpe

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