6

この単純な関数を検討してください

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=['', '']

4

6 に答える 6

13

ビルトインを使用any()

def foo(l=[]):
    if any(l):
        print 'List is not empty'
    else:
        print 'List is empty'

foo([''])
# List is empty
于 2012-06-25T14:31:22.383 に答える
2

あなたの例では、リストが実際に空である唯一のケースは、角括弧内に何もない場合です。他の例では、さまざまな数の空の文字列を含むリストがあります。これらは単純に異なります(そして私が考えることができるすべての言語で、同じことが当てはまります)。

于 2012-06-25T14:31:45.443 に答える
1

空の値のリストが空と見なされない理由についての最初の質問に答えるには、それら自体が空であっても、リストに何かが含まれているためです。空の箱の箱のように考えてください。

以下のコードは、関数を変更しfoo()て必要な処理を実行する(そしてテストする)1つの方法を示しています。空のリストが何であるかについてのあなたの概念は、言語自体が空であると見なすものに反するため、驚くほど考案するのが難しいものでした。ご覧のとおり、定義に従ってリストが「空」であるかどうかの判断を処理するすべてのロジックはempty_list()、他の実行する必要があることとはほとんど関係がないため、呼び出される別の関数に移動されfoo()ました。それは過度に複雑ではなく、他に何もなければ良い出発点を提供するべきではありません。

また、渡された引数がどのような種類のリストでもないか、リストであるが他のリストや文字列だけが含まれていない場合はどうすればよいかを言わなかったので、書かれているようにTypeError例外が発生します-何かこれは、ほとんどの組み込みPython関数でこれが発生したときに応答する方法と似ています。以下は、サンプルコードとそのテスト出力です。

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'

Python2.7で生成される出力は次のとおりです。

 foo( <nothing> ) -> list is empty
        foo( [] ) -> list is empty
      foo( [''] ) -> list is empty
  foo( ['', ''] ) -> list is empty
foo( ['', ['']] ) -> list is empty
   foo( ['abc'] ) -> list is not empty
foo( ['', 'abc'] ) -> list is not empty
   foo( [False] ) -> illegal argument exception
    foo( [None] ) -> illegal argument exception
       foo( [0] ) -> illegal argument exception
     foo( [0.0] ) -> illegal argument exception
      foo( [0L] ) -> illegal argument exception
      foo( [0j] ) -> illegal argument exception
      foo( [42] ) -> illegal argument exception
      foo( [{}] ) -> illegal argument exception
 foo( [{'': 0}] ) -> illegal argument exception
foo( [{'a': 1}] ) -> illegal argument exception
     foo( False ) -> illegal argument exception
      foo( None ) -> list is empty
         foo( 0 ) -> illegal argument exception
       foo( 0.0 ) -> illegal argument exception
        foo( 0L ) -> illegal argument exception
        foo( 0j ) -> illegal argument exception
        foo( 42 ) -> illegal argument exception
        foo( {} ) -> illegal argument exception
   foo( {'': 0} ) -> illegal argument exception
  foo( {'a': 1} ) -> illegal argument exception
于 2012-06-26T20:10:53.970 に答える
1

関数fooの再帰呼び出しを使用して、ネストされたリストを処理できます。

def foo(l=[]):
    if type(l)==list:
        return any([foo(x) for x in l])
    else:
        return bool(l)
于 2012-06-25T14:58:30.137 に答える
1

まず第一に:空の文字列でさえ文字列です。空の文字列を含むリストには、まだ要素が含まれています。

a=''len = 0の場合は空ですが、リストに関係なく、要素が含まれています。たとえば、とmylist = [a]同じですが、mylist = ['']わかりやすい場合があります。要素として取りa、内容を無視します。

リストの要素が空かどうかを確認するには、それらを繰り返し処理します。

def isEmpty(li=[]):
  for elem in li:
    if len(elem) > 0: return false
  return true
于 2012-06-25T14:35:09.183 に答える
0

リスト['']は、実際、空ではありません。空の文字列が含まれています。文字列は空ですが、リストは空ではありません。これらのリストを検索する場合は、リストが空かどうかを確認し、空でない場合は、すべてのエントリが''であるかどうかを確認してください。

于 2012-06-25T14:31:56.670 に答える