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

我的想法是这样的:

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

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


当前回答

使用过滤器:

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

使用过滤器的缺点是,它比替代品慢;而且,通常是昂贵的。

或者你也可以选择最简单且迭代性最强的方法:

# 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

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

其他回答

使用列表推导式是最python化的方式:

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

如果列表必须就地修改,因为有其他引用必须看到更新的数据,那么使用slice赋值:

strings[:] = [x for x in strings if x]

请记住,如果您想在字符串中保留空白,您可能会使用某些方法无意中删除它们。 如果你有这个列表

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

我会使用滤镜:

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

你可以用这样的东西

test_list = [i for i in test_list if i]

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

总结最佳答案:

1. 消除空带而不剥离:

也就是说,全空间字符串被保留:

slist = list(filter(None, slist))

优点:

简单的; 最快(参见下面的基准测试)。

2. 消除空后剥离…

2.一个……当字符串之间不包含空格时:

slist = ' '.join(slist).split()

优点:

小的代码 快 (但与@paolo-melchiorre的结果相反,由于内存的原因,在大数据集上不是最快的)

2.b…当字符串在单词之间包含空格?

slist = list(filter(str.strip, slist))

优点:

最快; 代码的可理解性。

2018年机器的基准测试:

## Build test-data
#
import random, string
nwords = 10000
maxlen = 30
null_ratio = 0.1
rnd = random.Random(0)                  # deterministic results
words = [' ' * rnd.randint(0, maxlen)
         if rnd.random() > (1 - null_ratio)
         else
         ''.join(random.choices(string.ascii_letters, k=rnd.randint(0, maxlen)))
         for _i in range(nwords)
        ]

## Test functions
#
def nostrip_filter(slist):
    return list(filter(None, slist))

def nostrip_comprehension(slist):
    return [s for s in slist if s]

def strip_filter(slist):
    return list(filter(str.strip, slist))

def strip_filter_map(slist): 
    return list(filter(None, map(str.strip, slist))) 

def strip_filter_comprehension(slist):  # waste memory
    return list(filter(None, [s.strip() for s in slist]))

def strip_filter_generator(slist):
    return list(filter(None, (s.strip() for s in slist)))

def strip_join_split(slist):  # words without(!) spaces
    return ' '.join(slist).split()

## Benchmarks
#
%timeit nostrip_filter(words)
142 µs ± 16.8 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit nostrip_comprehension(words)
263 µs ± 19.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit strip_filter(words)
653 µs ± 37.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit strip_filter_map(words)
642 µs ± 36 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit strip_filter_comprehension(words)
693 µs ± 42.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit strip_filter_generator(words)
750 µs ± 28.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit strip_join_split(words)
796 µs ± 103 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)