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

962
我想从Python的字符串列表中删除所有空字符串。
我的想法看起来像这样:
while '' in str_list:
    str_list.remove('')

有没有更符合 Python 风格的方法来完成这个任务?


50
@Ivo,这两个陈述都不正确。在使用for x in list迭代列表时,您永远不应该修改该列表。如果您使用while loop,则可以这样做。演示的循环将删除空字符串,直到没有更多的空字符串为止,然后停止。实际上,我甚至没有看问题(只看了标题),但我给出了完全相同的循环作为可能性!如果您不想出于内存考虑使用 comprehensions 或 filters,则这是一种非常 Pythonic 的解决方案。 - aaronasterling
4
永远不要改变你正在迭代的列表,这仍然是一个非常有效的观点 :) - Eduard Luca
1
@EduardLuca 如果迭代列表的目的是为了更改它,那么你应该做的恰恰相反。你只需要小心,确保你不会因此引起意外行为。 - Jacqlyn
1
@EduardLuca, @JFA:重点是他没有遍历任何列表。如果他写成了for var in list:的形式,那么他会进行遍历。但是在这里,他写成了while const in list:的形式。这并不是在遍历任何内容,它只是在满足条件为假之前一直重复相同的代码。 - Camion
1
您可以使用过滤器来移除空字符串。代码应该长这个样子… data = list(filter(None, str_list)) - Jacob Ward
13个回答

8

请记住,如果您想保留字符串内的空格,使用某些方法可能会无意中将它们删除。

如果您有如下列表:

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

2
如果您想保留字符串中的空格,可能会意外地使用某些方法将它们删除。您是否喜欢这种方法? - AMC
谢谢,老兄。稍微改了一下就可以用了,即 space_clean_list = [x.strip() for x in y if x.strip()] - Muhammad Mehran Khan Attari

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

这是最直观的方法之一,执行速度也不错。


9
欢迎来到SO。你并没有被忽视,也没有遭到匿名投票者的攻击,而是得到了反馈。简言之:你提出的filter函数的第一个参数比lambda x: len(x)还糟糕,而后者比lambda x : x还差,而这四个解决方案中最差的是被选中的答案。虽然正确的功能是首选,但并不足够。将光标悬停在“踩”按钮上:它会显示“This answer is not useful”。 - John Machin

1
使用正则表达式和过滤器进行匹配。
lstr = ['hello', '', ' ', 'world', ' ']
r=re.compile('^[A-Za-z0-9]+')
results=list(filter(r.match,lstr))
print(results)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接