2012-06-25 8 views
6

diese einfache Funktion betrachtenPython, wie die Liste überprüfen does't einen beliebigen Wert enthalten

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

Jetzt ist foo

x=[] 
foo(x) 
#List is empty 

foo('') 
#List is empty 

nennen lassen Aber wenn x = [ ''] die Liste gilt nicht als leer!!!

x=[''] 
foo(x) 
#List is not empty 

Fragen -

  1. Warum Liste leerer Werte werden nicht als leer betrachtet? (Im Fall einer Variable wird als leer zB betrachtet)

    x='' 
    if x:print 'not empty!!' 
    else: print 'empty' 
    
  2. Wie kann ich Funktion foo() so ändern, dass die Liste als leer in allen diesen Fällen in Betracht gezogen werden: x=[], x=[''], x=['', '']

+0

Note- Ich verstehe bei x = [ ‚‘] die Liste ist nicht leer, aber trotzdem weißt du, dass es leer ist :) (oder es hat keine Werte/Daten, die benutzt werden können) –

+4

Was versuchst du wirklich? Warum willst du ** '['', '']' als "leer" betrachtet werden? –

+0

['', ''] ist kein großes Problem .... für diesen Satz (['', '']) kann verwendet werden !! –

Antwort

13

Verwendung des eingebauten in any()

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

foo(['']) 
# List is empty 
+2

Beachten Sie, dass dies für "[[']]]" fehlschlägt. Ich bin mir jedoch nicht sicher, ob das, was das OP tut, ohnehin klug ist. Entscheidender ist, dass dies für "[false]" fehlschlägt. – Eric

+0

Wahr in beiden Punkten gibt es Eric. –

2

in Ihren Beispielen ist der einzige Fall, in dem die Liste wirklich ist leer ist diejenige, in der nichts in den eckigen Klammern steht. In den anderen Beispielen haben Sie Listen mit verschiedenen Nummern von leeren Strings. Diese sind einfach verschieden (und in allen Sprachen, die ich mir vorstellen kann, würde das Gleiche wahr sein).

0

Die Liste [''] ist in der Tat nicht leer. Es enthält eine leere Zeichenfolge. Die Zeichenfolge ist leer, die Liste ist nicht. Wenn Sie diese Listen finden möchten, prüfen Sie, ob die Liste leer ist. Wenn nicht, prüfen Sie, ob jeder Eintrag '' ist.

1

Vor allem: Auch eine leere Zeichenfolge ist eine Zeichenfolge. Eine Liste, die eine leere Zeichenfolge enthält, enthält weiterhin ein Element.

während a='' mit len ​​leer = 0, es ist unabhängig für die Liste, enthält es noch ein Element, zum Beispiel mylist = [a] die gleichen wie mylist = [''] ist, aber es könnte Sie klarer. Nimm a als ein Element und ignoriere den Inhalt.

Um zu überprüfen, ob Elemente einer Liste leer sind, durchlaufen Sie sie iterativ.

+0

Ich denke, du hast eine falsche Logik. Wenn Sie "len> 0" zurückgeben, ist es nicht sinnvoll, danach über "l" zu iterieren. – glglgl

+0

@gigigi: du hast total Recht, ich habe es behoben. Aber irgendwas soll auch funktionieren. – tuergeist

1

Sie können einen rekursiven Aufruf der Funktion foo verwenden, um verschachtelte Listen zu bearbeiten.

def foo(l=[]): 
    if type(l)==list: 
     return any([foo(x) for x in l]) 
    else: 
     return bool(l) 
1

Um Ihre erste Frage, warum eine Liste leerer Werte zu beantworten nicht leer betrachtet, ist es, weil es etwas tut, enthalten, auch wenn diese Dinge selbst leer sind. Stellen Sie sich das wie eine Kiste leerer Kisten vor.

Der folgende Code zeigt eine Möglichkeit, die Funktion foo() zu ändern, um das zu tun, was Sie wollen (und es zu testen). Ihre Vorstellung davon, was eine leere Liste ist, war überraschend schwierig zu entwickeln, teilweise, weil sie dem widerspricht, was die Sprache selbst für leer hält.Wie Sie sehen können, wurde die gesamte Logik, die sich mit der Bestimmung beschäftigt, ob die Liste gemäß Ihrer Definition "leer" ist, in eine separate Funktion mit der Bezeichnung empty_list() verschoben, da dies wahrscheinlich wenig mit dem Rest von foo() zu tun hat. Es ist nicht übermäßig komplex und wenn nichts anderes sollte Ihnen einen guten Ausgangspunkt bieten.

Sie haben auch nicht gesagt, was es tun soll, wenn das übergebene Argument keine Liste irgendeiner Art ist oder eine Liste war, aber nicht nur andere Listen oder Strings enthielt, so wie geschrieben, wird es ein erhöhen TypeError Ausnahme - etwas, das ähnlich wie die meisten integrierten Python-Funktionen reagieren, wenn dies bei ihnen auftritt. Im Folgenden wird die Probe Code und sein Testausgang:

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' 

Hier ist die Ausgabe, die es mit Python erzeugt 2.7: wirklich

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 
Verwandte Themen