我想从python中的字符串列表中删除所有空字符串。
我的想法是这样的:
while '' in str_list:
str_list.remove('')
还有更多的pythonic方法吗?
答案 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)
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;]