2009-01-21 14 views
8

मैं एक स्ट्रिंग लेने और मूल स्ट्रिंग बनाने वाले तारों की एक सूची बनाने के लिए देख रहा हूं।पायथन: सूची समझ रणनीति

उदा .:

"asdf" => ["a", "as", "asd", "asdf"] 

मैं वहाँ एक "pythonic" जिस तरह से यह करने के लिए यकीन है कि; मुझे लगता है कि मैं सिर्फ अपना दिमाग खो रहा हूं। ऐसा करने का सबसे अच्छा तरीका क्या है?

उत्तर

19

एक संभावना:

>>> st = 'asdf' 
>>> [st[:n+1] for n in range(len(st))] 
['a', 'as', 'asd', 'asdf'] 
+0

+1 वाह! रोज़ाना कुछ नया सीखें :) –

+0

बहुत कम तारों के अलावा किसी अन्य चीज़ पर इसका उपयोग करते समय सावधान रहें। 300-वर्ण वाली स्ट्रिंग एक 300-तत्व सूची उत्पन्न करेगी जिसमें 45,150 वर्ण हों! –

+6

एक मामूली बिंदु, लेकिन मैं श्रेणी() के बजाय xrange() का उपयोग करूंगा, क्योंकि आपको पूर्णांक की सूची बनाने की आवश्यकता नहीं है: >>> x = "asdf" >>> [x [: n] x में xrange (1, लेन (x) +1)] ['a', 'as', 'asd', 'asdf'] – user26294

17

आप अपने "सूची" के तत्वों से अधिक पाशन करने जा रहे हैं, तो आप बल्कि सूची समझ की तुलना में एक जनरेटर का उपयोग बंद बेहतर हो सकता है:

>>> text = "I'm a little teapot." 
>>> textgen = (text[:i + 1] for i in xrange(len(text))) 
>>> textgen 
<generator object <genexpr> at 0x0119BDA0> 
>>> for item in textgen: 
...  if re.search("t$", item): 
...   print item 
I'm a lit 
I'm a litt 
I'm a little t 
I'm a little teapot 
>>> 

यह कोड कभी भी एक वस्तु वस्तु नहीं बनाता है, न ही यह कभी भी (डेल्टा कचरा संग्रह) एक से अधिक अतिरिक्त स्ट्रिंग बनाता है (text के अतिरिक्त)।

+0

+1, मुझे ऑन-द-फ्लाई जेनरेटर का उपयोग पसंद है। –

+2

ध्यान दें कि आपको लूप के लिए सरल के साथ बहुत अधिक लाभ मिलते हैं - "x में xrange (len (text)): do_something_with (text [: n + 1])" –

+0

@dF: वह भी। :-) –