【问题标题】:How do I check if the list contains empty elements?如何检查列表是否包含空元素?
【发布时间】:2016-05-12 02:25:38
【问题描述】:

假设我有一个空字符串,它将被拆分:

>>>''.split(',')
['']

拆分的结果是['']。我使用bool 来检查它是否为空。它将返回True

>>>bool([''])
True

如何检查拆分结果是否为空?

【问题讨论】:

  • 我明白了。这不是一个空列表。我希望我能排除这种情况。我在想怎么办。
  • 最后,你想做什么?首先尝试拆分空列表是没有意义的,您可以在列表理解中使用 if 语句或 if 表达式来关闭此代码:if s1: s2 = s1.split(',') ...

标签: python list python-2.7


【解决方案1】:

拆分结果不为空。最好通过查看原始的未拆分字符串来检查您正在寻找的“空虚”感:

if not original_string:
    # It's empty.

但是如果你真的想看看这个拆分结果:

if len(split_result) == 1 and not split_result[0]:
    # It's "empty".

【讨论】:

    【解决方案2】:

    在你的情况下它真的不是空的

    如果您想检查该列表中的元素是否为空,您可以这样做:

    string = ''.split(',')
    
    if not string[0]:
        print "empty"
    

    【讨论】:

      【解决方案3】:

      使用bool(['']),您正在检查列表[''] 是否有任何内容,确实如此,内容恰好是空字符串''

      如果您想检查 所有 列表中的元素是否不是“空”(因此,如果列表包含字符串 '',它将返回 False),您可以使用内置函数all()

      all(v for v in l)
      

      这将获取列表l 中的每个元素v 并检查它是否具有True 值;如果 所有 元素都执行,则返回 True,如果至少有一个不执行,则返回 False。举个例子:

      l = ''.split(',')
      
      all(v for v in l)
      Out[75]: False
      

      您可以将其替换为 any() 以执行部分​​检查并查看列表l 中的任何项目 是否具有True 的值.

      兼具两种用途的更全面的示例*:

      l = [1, 2, 3, '']
      
      all(l)
      # '' doesn't have a True value
      Out[82]: False
      
      # 1, 2, 3 have a True value
      any(l)
      Out[83]: True
      

      *正如 @ShadowRanger 在 cmets 中指出的那样,all(l)any(l) 可以完成相同的操作,因为它们最后都只接受一个可迭代对象。

      【讨论】:

      • 简化:将all(v for v in l)改为all(l);当all 可以直接处理list 时,不需要制作特殊的生成器表达式。
      • 另外,你倒置了allanyall 告诉你是否所有结果都是非空的,而不是它是否有非空元素,any 说它是否有非空元素(它仍然可以有空,但如果 any 返回 @987654352 @,至少有一个是非空的)。 any 在这里可能更有用。
      • 如果元素包含值False,样本all([1, 2, 3, False]),则它不起作用,结果返回False。
      • @Ivan 做了它应该做的事情。由于它们all 没有 Truthy 值,因此它返回 False
      【解决方案4】:

      根据str.split() documentation,“用指定的分隔符分割空字符串返回['']。”

      要检查这种情况,当您使用显式分隔符时(例如您使用 split(",")),请执行以下操作:

      l = s.split(",")
      
      if len(l) == 1 and l[0] == '':
          print("string was empty")
      

      【讨论】:

        【解决方案5】:

        如果空是重要的结果,可能最好先测试原始字符串:

        x = ''
        if x:
            # Original string was non-empty, split it
            splitx = x.split(',')
            if any(splitx):
                # There was at least one character in the original string that wasn't a comma
        

        第一个测试排除了空的初始字符串,第二个使用any 排除了只是拆分字符的字符串,因此返回了一大堆空字符串,但没有非空字符串。只要你得到一个非空字符串,它就会通过。

        注意:如果您尝试解析 CSV 文件,请不要使用.split(',');有一个 csv module 可以正确处理这个问题(包括转义、引用等),并且应该始终用于解析 CSV,永远不要滚动你自己的解析器。额外奖励:csv 会将'' 输入转换为[] 行,您可以直接测试其真实性,而不是像str.split 那样转换为['']。示例:

        >>> import csv, io
        
        >>> f = io.StringIO('\n\na,b,c\n1,2,3\n\n')
        >>> [row for row in csv.reader(f) if row]  # Stripping easily
        [['a', 'b', 'c'], ['1', '2', '3']]
        

        对比与str.split(',') 相同的方法仍然不能处理引用、转义等:

        >>> f = io.StringIO('\n\na,b,c\n1,2,3\n\n')
        >>> stripped = (line.rstrip('\r\n') for line in f)  # Must manually strip line endings first
        >>> [line.split(',') for line in stripped if line]
        [['a', 'b', 'c'], ['1', '2', '3']]
        

        【讨论】:

          猜你喜欢
          • 2014-04-30
          • 2017-09-01
          • 2014-07-31
          • 2022-09-23
          • 2021-06-24
          • 1970-01-01
          • 2018-07-22
          • 1970-01-01
          相关资源
          最近更新 更多