2009-10-13 15 views
13

मैं जनरेटर ऑब्जेक्ट को रिवर्स करने का एक तरीका ढूंढ रहा हूं। मैं जानता हूँ कि दृश्यों को उल्टा करने के लिए कैसे:पायथन रिवर्स जेनरेटर

foo = imap(seq.__getitem__, xrange(len(seq)-1, -1, -1)) 

लेकिन इनपुट के रूप में एक जनरेटर और आउटपुट के रूप में एक उलट जनरेटर (लेन (सेक) ही रहता है के साथ कुछ ऐसा ही संभव है, इसलिए मूल अनुक्रम से मान हो सकता है उपयोग किया गया)?

+3

मुझे अनुक्रम को उलट करने के आपके उदाहरण के साथ अपवाद लेना होगा। क्यों न केवल 'उलट' का उपयोग करें? या 'रिवर्स'? यहां तक ​​कि 'seq [:: - 1]' आपके द्वारा लिखे गए शब्दों की तुलना में स्पष्ट है। –

+0

क्योंकि ये सभी उदाहरण एक नई सूची तैयार करेंगे। उपरोक्त मेरा उदाहरण एकमात्र तरीका है जिसे मैं पहली बार कॉपी किए बिना सूची बनाने के बारे में जानता हूं। –

+0

ठीक है, मैंने कुछ नया सीखा है [सीईसी [:: - 1] * * वास्तव में एक नई सूची बनाते हैं। नकारात्मक सूचकांक का उपयोग कर वैकल्पिक के लिए मेरे जनरेटर अभिव्यक्ति उत्तर देखें। – PaulMcG

उत्तर

19

आप इसे किसी भी सामान्य तरीके से जनरेटर को किसी अनुक्रम में कास्ट करके और उस से एक इटरेटर बनाने के अलावा नहीं कर सकते हैं। बाद में जनरेटर की शर्तों को तब तक ज्ञात नहीं किया जा सकता जब तक कि पहले की गणना नहीं की जाती।

इससे भी बदतर, आप यह नहीं जान सकते कि आपका जनरेटर कभी भी स्टॉपइटरेशन अपवाद को तब तक दबाएगा जब तक आप इसे हिट नहीं करते हैं, इसलिए यह जानने का कोई तरीका नहीं है कि आपके अनुक्रम में पहला शब्द भी होगा।

सबसे अच्छा आप एक reversed_iterator समारोह लिखने के लिए होगा कर सकता है:

def reversed_iterator(iter): 
    return reversed(list(iter)) 

संपादित करें: तुम भी, ज़ाहिर है, इस में अपने IMAP आधारित पुनरावृत्ति संस्करण के साथ एक सूची निर्माण को बचाने के लिए उलट जगह सकता है।

+13

कड़ाई से बोलते हुए, 'सूची (इटर) 'एक * कास्ट * नहीं है, यह इटरेटर इटर का उपभोग करके एक सूची का निर्माण है। मुझे यकीन नहीं है कि पाइथन में कोई * कास्ट * फ़ंक्शंस है, कम से कम इस अर्थ में नहीं कि उस शब्द का उपयोग सी या जावा जैसी भाषाओं में किया जाता है। int ("100") एक कास्ट नहीं है, और फ्लोट (100) एक कास्ट नहीं है - दोनों रचनाकार हैं जो वस्तुओं को वापस करते हैं। सी में, अगर कुछ डाला जाता है, तो मूल वस्तु वही रहती है। यदि आपने पायथन में ऐसी चीज की है, तो आप मूल मूल्य की आईडी ले सकते हैं, और जाली मान, और वे वही होंगे। संक्षेप में: पायथन में, कास्ट की मृत्यु हो गई है। – PaulMcG

+5

"कास्ट मर गया है": अच्छा है! :) –

+2

@ पॉल मैकगुइर: मैंने जो कहा है उसके महत्वपूर्ण हिस्सों से मैं सहमत हूं। एक नाइट, हालांकि: सी में, एक कास्ट * मूल वस्तु को बदल सकता है। यदि आप फ्लोट करने के लिए 100 कास्ट करते हैं, तो सी इसे 100.0f में बदल देगा; सी फ्लोट वैरिएबल में बिट पैटर्न 0x00000064 को फेंक नहीं देगा और इसे फ्लोट में होने वाले किसी भी मूल्य में बदल देगा।सी में, एक कास्ट बस प्रकार बदल सकता है ('int *' से 'long int *' में बदलें, या 'int' से' long int 'में बदलें या मूल्य और प्रकार बदल सकता है। सी ++ में कई कास्टिंग ऑपरेटर हैं, जिनमें से एक मूल्य को बदले बिना "reinterprets" प्रकार भी शामिल है। – steveha

6

reversed(list(input_generator)) शायद सबसे आसान तरीका है।

जनरेटर के मूल्यों को "अनुक्रम" क्रम में पहले सभी को इकट्ठा किए बिना प्राप्त करने का कोई तरीका नहीं है, क्योंकि दूसरी वस्तु उत्पन्न करने से पहले उत्पन्न होने वाले पहले पर भरोसा किया जा सकता है।

4

आपको पहले आइटम प्राप्त करने के लिए जनरेटर के माध्यम से चलना होगा ताकि आप एक सूची भी बना सकें।

reversed(list(g)) 

जहां g जनरेटर है।

reversed(tuple(g)) 

भी काम करेगा (मैंने यह देखने के लिए जांच नहीं की कि प्रदर्शन में कोई महत्वपूर्ण अंतर है या नहीं)।

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