【问题标题】:Get first non-empty string from a list in python从python中的列表中获取第一个非空字符串
【发布时间】:2009-07-16 14:30:41
【问题描述】:

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

【问题讨论】:

  • 您想要引用第一个空字符串还是要从列表中删除所有空字符串?这个列表是从一个拆分字符串生成的吗?
  • 从正则表达式生成:matches = re.findall(r"foo(\d+)|bar(\d+)") - 我想要第一个非空字符串,但对如何也删除所有空字符串(正则表达式可能会变长)。
  • 您问题的标题与您的问题正文不对应。修复其中一个。

标签: python string list


【解决方案1】:
next(s for s in list_of_string if s)

编辑:由 Stephan202 在 cmets 建议的 py3k 证明版本,谢谢。

【讨论】:

  • [] 被称为列表理解。
  • py3k 版本:next(s for s in list_of_string if s).
  • 顺便说一句,如果所有字符串都为空,它将引发StopIteration
  • @Fred:这真的很令人困惑:next(generator) 适用于 2.6 和 3.x; generator.__next__() 在 3.x 中工作; generator.next() 适用于 2.x
  • 为了避免处理StopIterationnext() 的两个参数版本可用于指定一个备用值:next((s for s in list_of_strings if s), 'not found')
【解决方案2】:
def get_nonempty(list_of_strings):
    for s in list_of_strings:
        if s:
            return s

【讨论】:

  • 远没有上面建议的生成器理解那么优雅,也增加了源文件的复杂性。
  • 情人眼中的优雅,丹尼尔。与公认答案的版本不同,它完美无缺:这很重要
【解决方案3】:

要获取列表中的第一个非空字符串,您只需遍历它并检查它是否不为空。仅此而已。

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

【讨论】:

    【解决方案4】:

    要删除所有空字符串,

    [s for s in list_of_strings if s]

    要获取第一个非空字符串,只需创建此列表并获取第一个元素,或使用 wuub 建议的惰性方法。

    【讨论】:

    • 虽然有点低效!如果你在一个空的字符串之后有一百万个非空字符串,你将花费时间和内存来生成一百万个字符串的列表,只是为了得到第一个......至少,使用生成器!
    【解决方案5】:

    这里有一个简短的方法:

    filter(None, list_of_strings)[0]
    

    编辑:

    这里有一个稍微长一点的更好的方法:

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

    【讨论】:

    • 为什么第二种方式更好?
    • 这仅适用于 Python 2.x,并且效率低于生成器示例,因为 filter 迭代整个列表,而与内容无关。在 py3k 中filter 返回一个过滤器对象,它是不可订阅的。
    • @Fred:第一种方式将遍历并过滤掉每个空字符串,创建一个新列表,然后选择第一个结果。第二种方法将逐步过滤掉空字符串,直到找到第一个空字符串并将其返回。不会创建中间列表。例如,如果您有一个包含 10,000 个字符串的列表,而只有第一个为空,则第一个方法会在内存中创建一个包含 9,999 个字符串的新列表,而第二个方法则不会。
    • @Stephan202:我认为“稍长的方式”相当于生成器示例。
    • +1 获得适用于 Python 2.x 和 1.5.2 的答案 :-) -- 不幸的是,3.x 中没有
    【解决方案6】:

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

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

    返回它在列表中的索引。 'x' 绑定指向您的字符串列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-29
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      相关资源
      最近更新 更多