考虑这个简单的功能
def foo(l=[]):
if not l: print "List is empty"
else : print "List is not empty"
现在让我们打电话给foo
x=[]
foo(x)
#List is empty
foo('')
#List is empty
但如果x = [''],则列表不被视为空!!!
x=['']
foo(x)
#List is not empty
问题 -
为什么空值列表不被视为空? (如果是变量,则视为空)例如
x=''
if x:print 'not empty!!'
else: print 'empty'
如何修改函数foo(),以便在所有这些情况下列表都被视为空:x=[]
,x=['']
,x=['', '']
答案 0 :(得分:13)
使用内置any()
def foo(l=[]):
if any(l):
print 'List is not empty'
else:
print 'List is empty'
foo([''])
# List is empty
答案 1 :(得分:2)
在您的示例中,列表实际为空的唯一情况是方括号中没有任何内容。在其他示例中,您有包含各种数量的空字符串的列表。这些是完全不同的(在我能想到的所有语言中,情况都是如此)。
答案 2 :(得分:1)
首先:即使是空字符串也是字符串。包含空字符串的列表仍包含元素。
虽然a=''
为空且len = 0,但无论列表如何,它仍然包含一个元素,例如mylist = [a]
与mylist = ['']
相同但它可能更清晰给你。将a
作为元素并忽略内容。
要检查列表中的元素是否为空,请迭代它们。
def isEmpty(li=[]):
for elem in li:
if len(elem) > 0: return false
return true
答案 3 :(得分:1)
您可以使用函数foo的递归调用来处理嵌套列表。
def foo(l=[]):
if type(l)==list:
return any([foo(x) for x in l])
else:
return bool(l)
答案 4 :(得分:1)
要回答关于为什么空值列表不被视为空的第一个问题,这是因为它确实包含某些内容,即使这些内容本身是空的。把它想象成一盒空盒子。
下面的代码显示了一种修改函数foo()
以执行所需操作(并对其进行测试)的方法。您对空列表的概念设计出人意料的难度很大,部分原因在于它与语言本身认为空洞的内容背道而驰。正如您所看到的那样,根据您的定义确定列表是否为“空”的所有逻辑都被移动到一个名为empty_list()
的单独函数中,因为这可能与其余的foo()
没什么关系。 1}}必须完成。它不是太复杂,如果没有别的东西可以为你提供一个良好的起点。
此外,如果传递的参数不是任何类型的列表,或者是列表但不包含其他列表或字符串,那么您没有说它应该做什么,所以写入它会引发{ {1}}异常 - 与大多数内置Python函数响应的方式类似。下面是示例代码及其测试输出:
TypeError
这是使用Python 2.7生成的输出:
try:
string_type = basestring
except NameError: # probably Python 3.x
string_type = str
class _NULL(object): # unique marker object
def __repr__(self): return '<nothing>'
_NULL = _NULL()
def empty_list(arg=_NULL):
arg = arg if arg is not _NULL else []
if not isinstance(arg, (list, string_type)):
raise TypeError
elif isinstance(arg, string_type):
return not len(arg)
else:
return len(arg) == 0 or all(empty_list(e) for e in arg)
def foo(list_=None):
if list_ is None or empty_list(list_):
print 'list is empty'
else:
print 'list is not empty'
testcases = [
_NULL,
[],
[''],
['', ''],
['', ['']],
['abc'],
['', 'abc'],
[False],
[None],
[0],
[0.0],
[0L],
[0j],
[42],
[{}],
[{'':0}],
[{'a':1}],
False,
None,
0,
0.0,
0L,
0j,
42,
{},
{'':0},
{'a':1},
]
for arg in testcases:
call = 'foo( {!r:s} ) ->'.format(arg)
print '{!s:>20s}'.format(call),
try:
foo() if arg is _NULL else foo(arg)
except TypeError:
print 'illegal argument exception'
答案 5 :(得分:0)
列表['']确实不是空的。它包含一个空字符串。该字符串为空,列表不是。如果要查找这些列表,请检查列表是否为空,如果不是,请检查每个条目是否为“”。