如何检查列表是否包含空元素?

2024-04-26 23:40:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

>>>bool([''])
True

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


Tags: 字符串truesplitbool
3条回答

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

如果要检查该列表中的元素是否为空,可以执行以下操作:

string = ''.split(',')

if not string[0]:
    print "empty"

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

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

all(v for v in l)

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

l = ''.split(',')

all(v for v in l)
Out[75]: False

您可以用^{}替换它来执行部分检查,并查看列表中的项是否有值l

一个更全面的例子*两种用途:

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

*正如评论中指出的,同样的事情也可以通过all(l)any(l)来完成,因为他们最后都接受了一个iterable。

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

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

第一个测试排除了空的初始字符串,第二个测试使用^{}排除了只不过是拆分字符的字符串,因此返回了一整串空字符串,但没有非空字符串。只要你有一个非空字符串,它就通过了。

注意:如果您试图解析CSV文件,请不要使用.split(',');有一个^{} 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']]

相关问题 更多 >