# 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
这是最直观的方法,并且在适当的时间内完成 .
2
根据列表的大小,如果使用list.remove()而不是创建新列表,则效率最高:
l = ["1", "", "3", ""]
while True:
try:
l.remove("")
except ValueError:
break
这样做的好处是不创建新列表,但每次都必须从头开始搜索,尽管不像上面提到的那样使用 while '' in l ,但每次出现时只需要搜索一次 '' (肯定有办法保留最好的两种方法,但它更复杂) .
请记住,如果您想保留 white spaces within a string ,可以使用某些方法无意中删除它们 . 如果你有这个清单
['你好世界','','','你好']你可能想要什么['你好世界','你好']
首先修剪列表以将任何类型的空格转换为空字符串:
space_to_empty = [x.strip() for x in _text_list]
然后从列表中删除空字符串
space_clean_list = [x for x in space_to_empty if x]
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
4
str_list = ['2', '', '2', '', '2', '', '2', '', '2', '']
for item in str_list:
if len(item) < 1:
str_list.remove(item)
14 回答
我会用filter:
Python 3从
filter
返回一个迭代器,因此应该包含在对list()
的调用中(等等 . )
测试:
List comprehensions
输出:
['first', 'second']
编辑:按建议缩短
filter实际上有一个特殊的选项:
它将过滤掉所有评估为False的元素 . 不需要在这里使用实际的可调用对象,如bool,len等 .
它和 Map 一样快(bool,......)
比较时间
请注意
filter(None, lstr)
不会删除空格' '
的空字符串,它只会删除''
而' '.join(lstr).split()
同时删除它们 .要删除空白字符串
filter()
,需要花费更多时间:而不是if,我会使用X!=''来消除空字符串 . 像这样:
这将在列表中保留None数据类型 . 此外,如果您的列表有整数,0是其中之一,它也将被保留 .
例如,
来自@ Ib33X的回复太棒了 . 如果要删除每个空字符串,请在剥离后删除 . 你也需要使用strip方法 . 否则,如果它有空格,它也将返回空字符串 . 就像,“”对于那个答案也是有效的 . 所以,可以实现 .
答案是
["first", "second"]
.如果你想使用
filter
方法,你可以这样做list(filter(lambda item: item.strip(), strings))
. 这给出了相同的结果 .使用
filter
:指出使用过滤器的缺点是它比替代品慢;另外,
lambda
通常很昂贵 .或者你可以选择最简单,最迭代的方法:
这是最直观的方法,并且在适当的时间内完成 .
根据列表的大小,如果使用list.remove()而不是创建新列表,则效率最高:
这样做的好处是不创建新列表,但每次都必须从头开始搜索,尽管不像上面提到的那样使用
while '' in l
,但每次出现时只需要搜索一次''
(肯定有办法保留最好的两种方法,但它更复杂) .由Aziz Alto
filter(None, lstr)
报告不会删除空字符串' '
,但如果您确定lstr只包含字符串,则可以使用filter(str.strip, lstr)
比较我的电脑上的时间
使用空格
' '
删除''
和空字符串的最快解决方案仍为' '.join(lstr).split()
.如评论中所述,如果您的字符串包含空格,情况就不同了 .
您可以看到
filter(str.strip, lstr)
保留带有空格的字符串,但' '.join(lstr).split()
将拆分此字符串 .请记住,如果您想保留 white spaces within a string ,可以使用某些方法无意中删除它们 . 如果你有这个清单
['你好世界','','','你好']你可能想要什么['你好世界','你好']
首先修剪列表以将任何类型的空格转换为空字符串:
然后从列表中删除空字符串
剥离后消除空箱:
一些PRO:
懒惰,基于生成器,以节省内存;
代码的可理解性;
快速,有选择地使用内置和理解 .
简短又甜蜜 .
循环遍历现有字符串列表然后检查空字符串,如果它不为空,则填充具有非空值的新字符串列表,然后用新字符串列表替换旧字符串列表
filter(None, str)
不会删除空格' '的空字符串,它只会删除'' and '' .join(str).split()
删除两者 . 但是如果你的列表元素有空格那么它也会改变你的列表元素,因为它首先加入你列表的所有元素然后用空格来拼写它们所以你应该使用: -它会删除这两个并且不会影响你的元素也像: -
输出: -
['hello','world','ram'] <--------------
' '.join(lstr).split()
的输出['hello','world ram']