2010-03-23 7 views
30

मान लीजिए कि मेरे पास एक ऐसी सूची है जिसे मैं वापस नहीं करना चाहता हूं लेकिन मूल्यों को उत्पन्न करना चाहता हूं। ऐसा करने के लिए सबसे अधिक पागल तरीका क्या है?किसी सूची से सभी मूल्यों को पाइथनिक रूप से कैसे प्राप्त करें?

मेरा मतलब यह है कि मेरा क्या मतलब है। कुछ गैर आलसी गणना के लिए धन्यवाद मैंने सूची ['a', 'b', 'c', 'd'] की गणना की है, लेकिन परियोजना के माध्यम से मेरा कोड आलसी गणना का उपयोग करता है, इसलिए मैं पूरी सूची को वापस करने के बजाय अपने फ़ंक्शन से मूल्य उत्पन्न करना चाहता हूं।

मैं वर्तमान में निम्नलिखित के रूप में यह लिखा है:

my_list = ['a', 'b', 'c', 'd'] 
for item in my_list: 
    yield item 

लेकिन यह मेरे लिए pythonic महसूस नहीं करता है।

+3

क्यों है क्या आपको ऐसा करने की ज़रूरत है, आप "कंटेनर में एक्स के लिए" का उपयोग कर सकते हैं जहां कंटेनर एक सूची है या कंटेनर एक इटरेटर है ... सिंटैक्स प्रकार के बावजूद नहीं बदलता है, तो यह क्यों मायने रखता है कि यह एक सूची है या नहीं या एक पुनरावर्तक? आपको अभी भी इससे उपज करने के लिए सूची में लटका देना होगा, इसलिए बस सूची के चारों ओर पास करें। –

+0

साइड टिप्पणी: "सूची" के साथ, कई लोग इसे अग्रणी अपरकेस (पीईपी 8 देखें) के कारण कक्षा के नाम के रूप में सोचेंगे। आप "list_", या "my_list", आदि का उपयोग कर सकते हैं – EOL

+0

ईओएल, मैं आपकी टिप्पणी की सराहना करता हूं। धन्यवाद। – bodacydo

उत्तर

28

उपयोग iter कह एक सूची बनाने के द्वारा एक जनरेटर का निर्माण कर सकते इटरेटर उदा

return iter(List) 

हालांकि यदि आपके पास पहले से ही एक सूची है, तो आप इसे वापस कर सकते हैं, जो अधिक कुशल होगा।

+0

अच्छा सवाल। और मेरे पास कोई जवाब नहीं है। मैं पूरी सूची वापस कर दूंगा। मैंने सोचा कि जनरेटर लौटने का एक अच्छा विचार था क्योंकि प्रोजेक्ट में सबकुछ जेनरेटर का इस्तेमाल करता था (इस जगह को छोड़कर - मुझे यह सूची लाइब्रेरी से मिली है)। – bodacydo

+3

यह अधिक है क्योंकि 'iter' पर कॉल पूरी तरह से अनावश्यक है। – msw

+2

'iter' एक ओवरकिल है लेकिन यह पूरी तरह से अनावश्यक नहीं है, यह याद रखने के लिए इस्तेमाल किया जा सकता है कि आप सूची के माध्यम से कहां चल रहे हैं और आप इसे पास कर सकते हैं, सूची के साथ आपको एक इंडेक्स भी पास करना होगा –

1

आप

(x for x in List) 
+0

तो मैं 'वापसी (एक्स सूची में एक्स के लिए एक्स) कर सकता हूं? – bodacydo

+1

हां। लेकिन मुझे नहीं लगता कि यह आपको बहुत अधिक प्रयास बचाएगा, क्योंकि आप पूरी सूची की गणना कर चुके हैं, तो इसे वापस क्यों न करें? –

+6

बिल्ट-इन इटर() यह आपके लिए करता है: जनरेटर अभिव्यक्ति की कोई आवश्यकता नहीं है, जो धीमे होने का नुकसान भी है। – EOL

34

चूंकि यह प्रश्न निर्दिष्ट नहीं करता है; मैं, Python >= 3.3

में लागू होता है कि आप केवल जरूरत है उस सूची वापस करने के लिए एक उत्तर प्रदान करेंगे Anurag suggests के रूप में करते हैं, लेकिन किसी कारण से यदि प्रश्न में समारोह वास्तव में एक जनरेटर होने की जरूरत है, तो आप एक जनरेटर को सौंप सकता है; मान लीजिए कि आप परिणाम सूची को प्रत्ययित करना चाहते हैं, लेकिन केवल तभी जब सूची पहले समाप्त हो जाती है।

def foo(): 
    list_ = ['a', 'b', 'c', 'd'] 
    yield from list_ 

    if something: 
     yield this 
     yield that 
     yield something_else 

3.3 से पहले पायथन के संस्करणों में, हालांकि, आप इस वाक्यविन्यास का उपयोग नहीं कर सकते हैं; आपको कोड में लूप और एकल उपज स्टेटमेंट के साथ प्रश्न के रूप में कोड का उपयोग करना होगा।

वैकल्पिक रूप से; आप एक नियमित समारोह में जनरेटर लपेट और chain एड परिणाम लौट सकते हैं: यह भी अजगर 2 में काम करने का लाभ और 3

from itertools import chain 

def foo(): 
    list_ = ['a', 'b', 'c', 'd'] 

    def _foo_suffix(): 
     if something: 
      yield this 
      yield that 
      yield something_else 

    return chain(list_, _foo_suffix()) 
+14

'सूची_' सुविधा से उपज एक अच्छा वाक्यविन्यास है, और यही वह है जो मैं यहां देख रहा था। शर्म मैं इसका उपयोग 2.7 में नहीं कर सकता। –

0

बेस्ट Pythonically तरह से इस कार्य को करना है

In [1]: my_list = ['a', 'b', 'c', 'd'] 

In [2]: (x for x in my_list) 
Out[2]: <generator object <genexpr> at 0x7fd9e4fdc230> 
संबंधित मुद्दे

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