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
在这里可能更有用。如果元素包含value
False
,sample
all([1,2,3,False])
,False将作为结果返回。@Ivan这样做是正确的。因为它们都没有真实值,所以返回
False