从Python列表中获取第一个非空字符串

17

在Python中,我有一个字符串列表,其中一些字符串可能为空字符串。获取第一个非空字符串的最佳方法是什么?


从正则表达式生成:matches = re.findall(r"foo(\d+)|bar(\d+)") - 我想要第一个非空字符串,但也想知道如何删除所有空字符串(正则表达式可能会变长)。 - Simon D
6个回答

30
next(s for s in list_of_string if s)

感谢Stephan202提供的Python 3版本。


5
顺便提一下,如果所有字符串都是空的,它会引发StopIteration异常。 - SilentGhost
9
为了避免处理StopIteration,可以使用next()函数的两个参数版本来指定备用值:next((s for s in list_of_strings if s), 'not found')。其中s为字符串列表中的元素,如果有元素存在则返回第一个元素,否则返回指定的备用值'not found' - matts

6

要删除所有空字符串,可以使用以下代码:

[s for s in list_of_strings if s]

如果要获取第一个非空字符串,可以创建该列表并获取其第一个元素,或者使用wuub建议的惰性方法。


5
有点低效!如果你有一个空字符串之后有一百万个非空字符串,你会花费时间和内存来生成一个包含一百万个字符串的列表,仅仅为了获取第一个字符串... 至少使用生成器! - user109839

4
def get_nonempty(list_of_strings):
    for s in list_of_strings:
        if s:
            return s

2
比上面建议的生成器推导要不太优雅,还会给源文件增加更多复杂性。 - Daniel Goldberg
2
优雅是观者丹尼尔眼中的美,它运行无瑕疵,不像被接受的答案版本:这才是最重要的。 - SilentGhost

3
这里有一个简短的方法:
filter(None, list_of_strings)[0]

编辑:

这里有一种稍微复杂但更好的方法:

from itertools import ifilter
ifilter(None, list_of_strings).next()

第二种方式为什么更好? - Simon D
1
这仅适用于Python 2.x,并且比生成器示例效率低,因为filter会遍历整个列表,而不考虑内容。在py3k中,filter返回一个不可订阅的过滤器对象。 - Stephan202
@Fred:第一种方法将遍历并过滤掉每个空字符串,创建一个新列表,并选择第一个结果。第二种方法将遍历列表,过滤掉空字符串,直到找到第一个空字符串并返回。不会创建任何中间列表。例如,如果您有一个包含10,000个字符串的列表,只有第一个为空,则第一种方法会在内存中创建一个包含9,999个字符串的新列表,而第二种方法则不会。 - Steve Losh
1
@Stephan202:我认为“稍微长一些的方式”与生成器示例是等价的。 - Steve Losh
1
把下面这段关于编程的内容从英语翻译成中文。只返回翻译后的文本:+1 如果回答适用于 Python2.x 和 1.5.2 版本 :-) ——不幸的是,不适用于 3.x 版本。 - John Machin
@Steve。确实如此。py3k的等效方法是next(filter(None, list_of_strings))。(无需导入。) - Stephan202

1

要获取列表中第一个非空字符串,只需循环遍历并检查其是否为空即可。就是这么简单。

arr = ['','',2,"one"]
for i in arr:
    if i:
        print i
        break

0

根据您的问题,我需要做出很多假设,但是要“获取”第一个非空字符串:

(i for i, s in enumerate(x) if s).next()

该函数返回列表中字符串的索引。'x'绑定指向您的字符串列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接