python移除逗號 - 從字符串列表中刪除空字符串




python清除空格 (10)

@ Ib33X的回复非常棒。 如果你想刪除每個空字符串,剝離後。 你也需要使用strip方法。 否則,如果它有空格,它也會返回空字符串。 比如,“”對於那個答案也是有效的。 所以,可以通過。

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

答案是["first", "second"]
如果你想使用filter方法,你可以這樣做
list(filter(lambda item: item.strip(), strings)) 。 這是相同的結果。

https://code.i-harness.com

我想從Python中的字符串列表中刪除所有空字符串。

我的想法如下所示:

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

有沒有更多的pythonic方式來做到這一點?


列表解析

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

輸出: ['first', 'second']

編輯:縮短建議


使用filter

newlist=filter(lambda x: len(x)>0, oldlist) 

指出使用過濾器的缺點是它比替代方法慢; 另外, lambda通常是昂貴的。

或者你可以選擇最簡單和最重複的一切:

# I am assuming listtext is the original list containing (possibly) empty items
for item in listtext:
    if item:
        newlist.append(str(item))
# You can remove str() based on the content of your original list

這是最直觀的方法,並在體面的時間。


我會使用filter

str_list = filter(None, str_list) # fastest
str_list = filter(bool, str_list) # fastest
str_list = filter(len, str_list)  # a bit slower
str_list = filter(lambda item: item, str_list) # slower than list comprehension

Python 3從filter返回一個迭代filter ,所以應該包裝在一個調用list()

str_list = list(filter(None, str_list)) # fastest

測試:

>>> timeit('filter(None, str_list)', 'str_list=["a"]*1000', number=100000)
2.4797441959381104
>>> timeit('filter(bool, str_list)', 'str_list=["a"]*1000', number=100000)
2.4788150787353516
>>> timeit('filter(len, str_list)', 'str_list=["a"]*1000', number=100000)
5.2126238346099854
>>> timeit('[x for x in str_list if x]', 'str_list=["a"]*1000', number=100000)
13.354584932327271
>>> timeit('filter(lambda item: item, str_list)', 'str_list=["a"]*1000', number=100000)
17.427681922912598

正如Aziz Alto filter(None, lstr)所報告的filter(None, lstr)不會用空格' '刪除空字符串,但如果您確信lstr只包含字符串,則可以使用filter(str.strip, lstr)

>>> lstr = ['hello', '', ' ', 'world', ' ']
>>> lstr
['hello', '', ' ', 'world', ' ']
>>> ' '.join(lstr).split()
['hello', 'world']
>>> filter(str.strip, lstr)
['hello', 'world']

在我的電腦上比較時間

>>> from timeit import timeit
>>> timeit('" ".join(lstr).split()', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
3.356455087661743
>>> timeit('filter(str.strip, lstr)', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
5.276503801345825

用空格刪除''和空字符串''的最快解決方案仍然是' '.join(lstr).split()

正如評論中所報導的那樣,如果你的字符串包含空格,情況就會不同

>>> lstr = ['hello', '', ' ', 'world', '    ', 'see you']
>>> lstr
['hello', '', ' ', 'world', '    ', 'see you']
>>> ' '.join(lstr).split()
['hello', 'world', 'see', 'you']
>>> filter(str.strip, lstr)
['hello', 'world', 'see you']

你可以看到filter(str.strip, lstr)保留了其上有空格的字符串,但' '.join(lstr).split()將分割這些字符串。


為了消除剝離後的空洞:

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

一些PRO:

  • 懶惰,基於生成器,以節省內存;
  • 代碼體面的可理解性;
  • 快速,有選擇地使用內置和理解。

    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
    

請記住,如果你想保留一個字符串中的空格 ,你可以使用一些方法無意中刪除它們。 如果你有這個清單

['hello world','','','hello']你可能想要的['hello world','hello']

首先修剪列表以將任何類型的空白轉換為空字符串:

space_to_empty = [x.strip() for x in _text_list]

然後從它們的列表中刪除空字符串

space_clean_list = [x for x in space_to_empty if x]

遍歷現有的字符串列表,然後檢查一個空字符串,如果它不是空的,用非空值填充一個新的字符串列表,然後用新的字符串列表替換舊的字符串列表


>>> 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)不會使用空格' '刪除空字符串,只會在' '.join(lstr).split()刪除這兩個' '.join(lstr).split()將其刪除。

要在刪除空白字符串時使用filter() ,需要更多時間:

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

str_list = ['2', '', '2', '', '2', '', '2', '', '2', '']

for item in str_list:
    if len(item) < 1:  
        str_list.remove(item)

簡短而甜美。







list