从字符串列表中删除空字符串

时间:2010-10-02 11:21:10

标签: python arrays string list

我想从python中的字符串列表中删除所有空字符串。

我的想法是这样的:

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

还有更多的pythonic方法吗?

16 个答案:

答案 0 :(得分:969)

我会使用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返回一个迭代器,因此应该包含在对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

答案 1 :(得分:195)

List comprehensions

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

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

编辑:按建议缩短

答案 2 :(得分:61)

过滤器实际上有一个特殊选项:

filter(None, sequence)

它将过滤掉评估为False的所有元素。不需要在这里使用实际的可调用语句,例如bool,len等。

它与地图同样快(bool,...)

答案 3 :(得分:21)

>>> 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()会删除这两个字符串。

要删除空白字符串filter(),需要花费更多时间:

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

答案 4 :(得分:11)

而不是x,我会使用X!=''来消除空字符串。像这样:

str_list = [x for x in str_list if x != '']

这将保留列表中的无数据类型。此外,如果您的列表有整数,0是其中之一,它也将被保留。

例如,

str_list = [None, '', 0, "Hi", '', "Hello"]
[x for x in str_list if x != '']
[None, 0, "Hi", "Hello"]

答案 5 :(得分:11)

来自@ Ib33X的回复真棒。如果要在剥离后删除每个空字符串。你也需要使用strip方法。否则,如果它有空格,它也将返回空字符串。喜欢," "对于那个答案也是有效的。所以,可以通过实现。

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

答案是["first", "second"]
如果您想使用filter方法,您可以这样做
list(filter(lambda item: item.strip(), strings))。这给出了相同的结果。

答案 6 :(得分:8)

根据列表的大小,如果使用list.remove()而不是创建新列表,则效率最高:

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

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

这样做的好处是不创建新列表,但缺点是每次都必须从头开始搜索,尽管与上面提到的使用while '' in l不同,它只需要每次出现{{1 (当然有一种方法可以保持两种方法的最佳状态,但它更复杂)。

答案 7 :(得分:7)

使用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

这是最直观的方法,并在适当的时间内完成。

答案 8 :(得分:5)

Aziz Alto 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()会拆分此字符串。

答案 9 :(得分:5)

请注意,如果您想将空格保留在字符串中,可以使用某些方法无意中删除它们。 如果你有这个清单

['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]

答案 10 :(得分:0)

剥离后消除空箱:

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
    

答案 11 :(得分:0)

对于包含空格和空值的列表,请使用简单的列表理解-

>>> s = ['I', 'am', 'a', '', 'great', ' ', '', '  ', 'person', '!!', 'Do', 'you', 'think', 'its', 'a', '', 'a', '', 'joke', '', ' ', '', '?', '', '', '', '?']

因此,您可以看到,此列表包含空格和null元素的组合。使用代码段-

>>> d = [x for x in s if x.strip()]
>>> d
>>> d = ['I', 'am', 'a', 'great', 'person', '!!', 'Do', 'you', 'think', 'its', 'a', 'a', 'joke', '?', '?']

答案 12 :(得分:0)

使用正则表达式和过滤器进行匹配

lstr = ['hello', '', ' ', 'world', ' ']
r=re.compile('^[A-Za-z0-9]+')
results=list(filter(r.match,lstr))
print(results)

答案 13 :(得分:-2)

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

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

简短又甜蜜。

答案 14 :(得分:-3)

循环遍历现有字符串列表,然后检查是否为空字符串,如果它不为空,则使用非空值填充新字符串列表,然后用新字符串列表替换旧字符串列表

答案 15 :(得分:-3)

filter(None, str)不会删除带有空格的空字符串&#39; &#39;,它只能修剪掉&#39;&#39;和&#39; &#39 ;.

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))

输出: -

[&#39; hello&#39;,&#39; world&#39;,&#39; ram&#39;]&lt; -------------- {的输出{1}}
[&#39;你好&#39;,&#39;世界公羊&#39;]