Removing empty strings from a list in python
我需要把绳子分开。我用这个:
1 2 3
| def ParseStringFile(string):
p = re.compile('\W+')
result = p.split(string) |
但我有一个错误:我的结果有两个空字符串(""),一个在"Лев"之前。我怎么摆脱他们?
- 不,它工作正常。空字符串是由字符串开头的额外新行引起的。
- nhahdh在使用split之前,我需要删除列表的第一个和最后一个空("")元素。
正如Nhahtdh所指出的,由于在字符串的开始和结束处都有一个
,所以应该是空字符串,但是如果它们打扰到您,您可以非常快速和有效地filter它们。
1 2
| >>> filter(None, ['', 'text', 'more text', ''])
['text', 'more text'] |
- 酷,这是我需要的。这很快就成了事实。
- @丹尼斯很乐意帮忙!如果答案对你有帮助,别忘了把它标为接受。
在匹配字符串之前,可以删除该字符串中的所有换行符:
1 2
| p.split(string.strip('
')) |
或者,拆分字符串,然后移除第一个和最后一个元素:
1
| result = p.split(string)[1:-1] |
[1:-1]获取结果的副本,包括从1开始(即删除第一个元素)到-2结束(即从第二个到最后一个元素)的所有索引。第二个索引是独占的)
一个较长且不太优雅的替代方案是就地修改列表:
1 2 3
| result = p.split(string)
del result[-1] # remove last element
del result[0] # remove first element |
注意,在这两个解决方案中,第一个和最后一个元素必须是空字符串。如果有时输入在开始或结束时不包含这些空字符串,那么它们将出现错误行为。然而,它们也是最快的解决方案。
如果要删除结果中的所有空字符串,即使它们发生在结果列表中,也可以使用列表理解:
1
| [word for word in p.split(string) if word] |
- 在少数情况下,filter实际上比列表竞争对手强。stackoverflow.com/questions/3845423/…
- @在这种情况下,斯莱特提拉斯我怀疑速度很重要,但可读性很重要,我更喜欢列表理解。同样,在python3中,filter不会生成一个列表,这可能是或可能不是OP想要的。另外,如果速度很重要,那么使用[1:-1]会更快,因为它完全避免了所有的真实性测试。
- 合理,只是想知道你可能想知道。作为一个通常认为像filter和map这样的东西不应该被使用的人,这是一个我真的需要为filter解决方案争论的案例。速度提高了5倍,直观地说,您正在筛选列表,但这两个都是准确的解决方案。[1:-1]在我看来是危险的脆弱。
- @答案来自2010年。在我的机器上,我得到了完全不同的结果,尽管使用None的filter仍然(显然)是最快的(在python2上约为2.8倍,在python3上约为85%)。在过去的4年里,在优化译员方面似乎做得很好。
- 过滤溶液的速度如何?我不想使用[1;-1]解决方案,因为文本不必有""符号,所有网站都是各种各样的
- 啊,这是个好消息!我只是在我的机器上运行它,得到了类似的结果。
- @丹尼斯,这是过滤解决方案中的速度,在python 2中仍然快3倍左右,而在python 3中的速度增长更为适度(不确定使用的是哪个)。
- 优化对我来说很有趣,如果它不能消除所有的可读性
- 我正在使用python 3.3