2009-10-07 8 views
20

Ich habe schon eine Menge von Konstrukten wie dies in den letzten paar Tagen schriftlich:Für die Liste, es sei denn leer in Python

list = get_list() 
if list: 
    for i in list: 
     pass # do something with the list 
else: 
    pass # do something if the list was empty 

Menge Müll und ich ordnen Sie die Liste zu einer reellen Variablen (es im Speicher zu halten länger als nötig). Python hat eine Menge meines Codes bis jetzt vereinfacht ... Gibt es einen einfachen Weg, dies zu tun?

(Mein Verständnis ist, dass die else im for: else: Konstrukt löst immer, nachdem sie geschlungen hat, leer oder nicht - so nicht, was ich will)

+2

Ich bin nicht sicher, irgendetwas ** könnte ** einfacher sein. Was ist daran falsch? Welche Codezeile möchten Sie entfernen? –

+0

Gut ...Idealerweise würde ich gerne aufhören, die Liste einer Variablen zuzuordnen und das if/else in einen Teil der for komprimieren (ich weiß, das ist unwahrscheinlich). Ich könnte 'mit get_list() als Liste verwenden:', aber das treibt die Dinge weiter voran – Oli

+1

@Oli: Bitte kommentieren Sie nicht Ihre eigene Frage. Bitte * aktualisieren * Ihre Frage mit zusätzlichen Details. –

Antwort

8

eine Liste Verständnis Verwendung:

def do_something(x): 
    return x**2 

list = [] 
result = [do_something(x) for x in list if list] 
print result  # [] 

list = [1, 2, 3] 
result = [do_something(x) for x in list if list] 
print result  # [1, 4, 9] 
+9

ausschneiden kann. Die "if-Liste" am Ende ist unnötig und wird für jedes Element nicht nur einmal ausgewertet. – FogleBird

+0

Guter Punkt, danke für die Korrektur! –

+2

Ihre Comprehensions behandeln nicht list = None –

2
def do_something_with_maybe_list(maybe_list): 
    if maybe_list: 
     for x in list: 
      do_something(x) 
    else: 
     do_something_else() 

do_something_with_maybe_list(get_list()) 

Sie könnten sogar die Aktionen extrahieren zu erfolgen:

def do_something_with_maybe_list(maybe_list, process_item, none_action): 
    if maybe_list: 
     for x in list: 
      process_item(x) 
    else: 
     none_action() 

do_something_with_maybe_list(get_list(), do_something, do_something_else) 
do_something_with_maybe_list(get_otherlist(), do_other, do_still_other) 

Bearbeiten von Oli: Oder weiter gehen ein:

def do_something_with_maybe_list(maybe_list, process_item, none_action): 
    if maybe_list: 
     return process_list(maybe_list) 
    return none_action() 

do_something_with_maybe_list(get_list(), do_something, do_something_else) 
do_something_with_maybe_list(get_otherlist(), do_other, do_still_other) 
+0

Vielleicht willst du wirklich ML. :) –

+0

Eine weitere Schicht Down-Stripping hinzugefügt. Die Verarbeitung kann (und wahrscheinlich auch) extern erfolgen. Und ich werde zurückkehren müssen, damit ich das "else", Guard-style – Oli

4

Slighty mehr knapp ist:

vorausgesetzt, Sie ändern nicht die Länge der Liste in der Schleife.

Bearbeiten von Oli: Zu meinen Sorgen der Speicherverbrauch zu kompensieren, möchte es with ing:

with get_list() as my_list: 
    for i in my_list: 
     # got a list 
    if not my_list: 
     # not a list 

Aber ja, das ist eine ganz einfache Art und Weise, um das Problem.

2

Wenn Ihre Aktionen verschiedenen sind, ich tun würde:

list_ = get_list() # underscore to keep built-in list 
if not list_: 
    # do something 
for i in list_: # 
    # do something for each item 

Wenn Ihre Aktionen ähnlich sind, ist dies noch schöner:

for i in list_ or [None]: 
    # do something for list item or None 

oder, wenn Sie None als Listenelement haben könnte,

for i in list_ or [...]: 
    # do something for list item or built-in constant Ellipsis 
27

auf den anderen Antworten Basierend, ich glaube, die saubersten Lösungen

#Handles None return from get_list 
for item in get_list() or []: 
    pass #do something 

oder das Verständnis equiv

result = [item*item for item in get_list() or []] 
1

sind Ich denke, Ihr Weg ist im Allgemeinen in Ordnung, aber Sie können diesen Ansatz in Betracht ziehen:

def do_something(item): 
    pass # do something with the list 

def action_when_empty(): 
    pass # do something if the list was empty 

# and here goes your example 
yourlist = get_list() or [] 
another_list = [do_something(x) for x in yourlist] or action_when_empty() 
-1
i = None 
for i in get_list(): 
    pass # do something with the list 
else: 
    if i is None: 
     pass # do something if the list was empty 

Hilft das? Ja, ich weiß, wir sind zwei Jahre weg von der Notwendigkeit :-)

+1

Dies funktioniert nicht, wenn das letzte Element in get_list() tatsächlich 'None' ist. – Danosaure

Verwandte Themen