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

我的想法是这样的:

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

还有什么更python化的方法吗?


当前回答

我会使用滤镜:

str_list = filter(None, str_list)
str_list = filter(bool, str_list)
str_list = filter(len, str_list)
str_list = filter(lambda item: item, str_list)

Python 3从filter返回一个迭代器,因此应该包装在调用list()中

str_list = list(filter(None, str_list))

其他回答

根据列表的大小,使用list.remove()而不是创建一个新列表可能是最有效的:

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

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

这样做的优点是不需要创建一个新的列表,但缺点是每次都必须从头搜索,尽管不像上面所建议的在l中使用while“每次只需要搜索一次”(当然有一种方法可以保持两种方法的优点,但它更复杂)。

你可以用这样的东西

test_list = [i for i in test_list if i]

其中test_list是要从中删除空元素的列表。

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

使用正则表达式和筛选器进行匹配

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

Filter实际上有一个特殊的选项:

filter(None, sequence)

它将过滤掉所有值为False的元素。这里不需要使用一个实际的可调用对象,比如bool, len等等。

它和map(bool,…)一样快