Python 如何检查列表是否包含空元素?
假设我有一个空字符串,它将被拆分:Python 如何检查列表是否包含空元素?,python,list,python-2.7,Python,List,Python 2.7,假设我有一个空字符串,它将被拆分: >>>''.split(',') [''] 拆分的结果是['']。我使用bool检查它是否为空。它将返回True >>>bool(['']) True 如何检查分割结果是否为空?分割结果不是空的。通过查看原始的、未拆分的字符串,可以最好地检查您正在寻找的“空”的感觉: if not original_string: # It's empty. 但如果您真的想查看此项的拆分结果: if len(split_res
>>>''.split(',')
['']
拆分的结果是['']
。我使用bool
检查它是否为空。它将返回True
>>>bool([''])
True
如何检查分割结果是否为空?分割结果不是空的。通过查看原始的、未拆分的字符串,可以最好地检查您正在寻找的“空”的感觉:
if not original_string:
# It's empty.
但如果您真的想查看此项的拆分结果:
if len(split_result) == 1 and not split_result[0]:
# It's "empty".
在你的情况下,它确实不是空的 如果要检查该列表中的元素是否为空,可以执行以下操作:
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
中是否有任何项的值为True
>>>bool([''])
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
*正如评论中所指出的,使用
all(l)
或any(l)
也可以做同样的事情,因为它们最终都只接受一个iterable 根据“使用指定分隔符拆分空字符串返回[“”]”
要检查这种情况,当您使用显式分隔符(如使用split(“,”
)时,请执行以下操作:
l = s.split(",")
if len(l) == 1 and l[0] == '':
print("string was empty")
如果空是重要的结果,那么最好首先测试原始字符串:
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(',')
;有一种方法可以正确地处理这个问题(包括转义、引用等),并且应该始终用于解析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']]
我懂了。这不是一个空列表。我希望排除这种情况。我在想怎么做。最终,你想做什么?首先,尝试拆分空列表没有任何意义,您可以使用if语句或列表理解中的if表达式对代码进行筛选:
if s1:s2=s1.split(',')…
简化:将all(v表示l中的v)
更改为all(l)
;如果all
可以直接处理列表
,则无需创建特殊的生成器表达式。此外,还可以反转all
和any
all
告诉您是否所有结果都是非空的,而不是它是否有非空元素,any
告诉您它是否有非空元素(它仍然可以有空元素,但是如果any
返回True
,至少有一个是非空的)any
在这里可能更有用。如果元素包含valueFalse
,sampleall([1,2,3,False])
,False将作为结果返回。@Ivan这样做是正确的。因为它们都没有真实值,所以返回False
。