python如何检查列表不包含任何值

时间:2012-06-25 14:28:46

标签: python-3.x python-2.7 python

考虑这个简单的功能

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

问题 -

  1. 为什么空值列表不被视为空? (如果是变量,则视为空)例如

    x=''
    if x:print 'not empty!!'
    else: print 'empty'
    
  2. 如何修改函数foo(),以便在所有这些情况下列表都被视为空:x=[]x=['']x=['', '']

6 个答案:

答案 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)

列表['']确实不是空的。它包含一个空字符串。该字符串为空,列表不是。如果要查找这些列表,请检查列表是否为空,如果不是,请检查每个条目是否为“”。