[英]How do I check if the list contains empty elements?
假设我有一个空字符串,它将被拆分:
>>>''.split(',')
['']
分裂的结果是['']
。 我用bool
检查它是否为空。 它将返回True
。
>>>bool([''])
True
如何检查拆分结果是否为空?
使用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在评论中指出的那样, all(l)
或any(l)
都可以完成同样的事情,因为它们最终都接受了一个迭代。
如果空虚是重要的结果,最好先测试原始字符串:
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
模块可以正确处理(包括转义,引用等),并且应该始终用于解析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']]
在你的情况下,它真的不是空的
如果要检查该列表中的元素是否为空,您可以执行以下操作:
string = ''.split(',')
if not string[0]:
print "empty"
拆分结果不为空。 通过查看原始的非分裂字符串,可以最好地检查您正在寻找的“空虚”感:
if not original_string:
# It's empty.
但是如果你真的想看看这个的拆分结果:
if len(split_result) == 1 and not split_result[0]:
# It's "empty".
根据str.split()
文档, “使用指定的分隔符拆分空字符串会返回['']。”
要检查这种情况,当您使用显式分隔符(如使用split(",")
)时,请执行以下操作:
l = s.split(",")
if len(l) == 1 and l[0] == '':
print("string was empty")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.