[Python] स्ट्रिंग्स की सूची से रिक्त स्ट्रिंग निकालें



Answers

समझ की सूची

strings = ["first", "", "second"]
[x for x in strings if x]

आउटपुट: ['first', 'second']

संपादित करें: सुझाए गए अनुसार संक्षिप्त

Question

मैं अजगर में तारों की सूची से सभी खाली तारों को हटाना चाहता हूं।

मेरा विचार इस तरह दिखता है:

while '' in str_list:
    str_list.remove('')

क्या ऐसा करने के लिए कोई और पाइथोनिक तरीका है?




अलग करने के बाद खालीियों को खत्म करने के लिए:

slist = map(lambda s: s and s.strip(), slist)
slist = filter(None, slist)

कुछ प्रो:

  • आलसी बचाने के लिए जेनरेटर पर आधारित आलसी;
  • कोड की सभ्य समझदारी;
  • तेजी से, चुनिंदा रचनाओं और समझ का उपयोग कर।

    def f1(slist):
        slist = [s and s.strip() for s in slist]
        return list(filter(None, slist))
    
    def f2(slist):
        slist = [s and s.strip() for s in slist]
        return [s for s in slist if s]
    
    
    def f3(slist):
        slist = map(lambda s: s and s.strip(), slist)
        return list(filter(None, slist))
    
    def f4(slist):
        slist = map(lambda s: s and s.strip(), slist)
        return [s for s in slist if s]
    
    %timeit f1(words)
    10000 loops, best of 3: 106 µs per loop
    
    %timeit f2(words)
    10000 loops, best of 3: 126 µs per loop
    
    %timeit f3(words)
    10000 loops, best of 3: 165 µs per loop
    
    %timeit f4(words)
    10000 loops, best of 3: 169 µs per loop
    



@ आईबी 33 एक्स से जवाब अद्भुत है। यदि आप छीनने के बाद, हर खाली स्ट्रिंग को हटाना चाहते हैं। आपको स्ट्रिप विधि का भी उपयोग करने की आवश्यकता है। अन्यथा, यदि यह सफेद रिक्त स्थान है तो यह खाली स्ट्रिंग भी वापस कर देगा। पसंद है, "" उस उत्तर के लिए भी मान्य होगा। तो, द्वारा हासिल किया जा सकता है।

strings = ["first", "", "second ", " "]
[x.strip() for x in strings if x.strip()]

इसका उत्तर ["first", "second"]
यदि आप इसके बजाय filter विधि का उपयोग करना चाहते हैं, तो आप ऐसा कर सकते हैं
list(filter(lambda item: item.strip(), strings)) । यह एक ही परिणाम देता है।




मौजूदा स्ट्रिंग सूची के माध्यम से लूप करें और फिर रिक्त स्ट्रिंग की जांच करें, यदि यह रिक्त नहीं है तो रिक्त मानों के साथ एक नई स्ट्रिंग सूची पॉप्युलेट करें और फिर पुरानी स्ट्रिंग सूची को नई स्ट्रिंग सूची से बदलें




filter(None, str) खाली स्थान को खाली स्थान से नहीं हटाता है, 'यह केवल prunes दूर' 'और' 'है।

join(str).split() दोनों को हटा देता है। लेकिन यदि आपकी सूची के तत्व में स्थान है तो यह आपके सूची तत्वों को भी बदल देगा क्योंकि यह पहले सूची के सभी तत्वों में शामिल हो रहा है और फिर उन्हें अंतरिक्ष से थूक रहा है ताकि आपको इसका उपयोग करना चाहिए: -

str = ['hello', '', ' ', 'world', ' ']
print filter(lambda x:x != '', filter(lambda x:x != ' ', str))

यह दोनों को हटा देगा और आपके तत्वों को भी प्रभावित नहीं करेगा: -

str = ['hello', '', ' ', 'world ram', ' ']
print  ' '.join(lstr).split()
print filter(lambda x:x != '', filter(lambda x:x != ' ', lstr))

उत्पादन: -

['हैलो', 'दुनिया', 'राम'] <-------------- ' '.join(lstr).split() का आउटपुट
['हैलो', 'वर्ल्ड रैम']




>>> lstr = ['hello', '', ' ', 'world', ' ']
>>> lstr
['hello', '', ' ', 'world', ' ']

>>> ' '.join(lstr).split()
['hello', 'world']

>>> filter(None, lstr)
['hello', ' ', 'world', ' ']

समय की तुलना करें

>>> from timeit import timeit
>>> timeit('" ".join(lstr).split()', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
4.226747989654541
>>> timeit('filter(None, lstr)', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
3.0278358459472656

ध्यान दें कि filter(None, lstr) एक स्पेस के साथ रिक्त स्ट्रिंग को नहीं हटाता है, ' ' यह केवल prunes दूर '' ' '.join(lstr).split() दोनों को हटा देता है।

सफेद स्पेस स्ट्रिंग के साथ filter() उपयोग करने के लिए, इसमें बहुत अधिक समय लगता है:

>>> timeit('filter(None, [l.replace(" ", "") for l in lstr])', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
18.101892948150635



अपनी सूची के आकार के आधार पर, यदि आप नई सूची बनाने के बजाय list.remove () का उपयोग करते हैं तो यह सबसे प्रभावी हो सकता है:

l = ["1", "", "3", ""]

while True:
  try:
    l.remove("")
  except ValueError:
    break

इसका एक नया सूची नहीं बनाने का लाभ है, लेकिन हर बार शुरुआत से खोज करने का नुकसान, हालांकि ऊपर दिए गए अनुसार while '' in l प्रयोग करने के विपरीत, इसे केवल '' घटना के प्रति एक बार खोजना आवश्यक है '' (निश्चित रूप से निश्चित रूप से है दोनों तरीकों का सर्वोत्तम रखने का एक तरीका है, लेकिन यह अधिक जटिल है)।






Links