2009-10-07 14 views
20

Pisałem dużo konstruktów tak ostatnich kilku dni:Na liście chyba pusty w 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 

Lot śmieci i przypisać listy do zmiennej rzeczywistej (utrzymując ją w pamięci dłużej niż potrzeba). Python uprościł wiele mojego kodu aż do teraz ... Czy istnieje prosty sposób na zrobienie tego?

(Mój zrozumienia jest to, że else w for: else: konstruktem zawsze wyzwala po jego zapętlony, pusty lub nie - tak nie to, co chcę)

+2

Nie jestem pewien, czy coś ** mogłoby ** być łatwiejsze. Co jest z tym nie tak? Którą linię kodu chciałbyś wyeliminować? –

+0

Cóż ...Idealnie chciałbym przestać przypisywać listę do zmiennej i skompresować if/else na część for (wiem, że jest to mało prawdopodobne). Mogę użyć 'with get_list() as list:', ale to wypycha rzeczy dalej – Oli

+1

@Oli: Proszę nie komentować własnego pytania. * Zaktualizuj * swoje pytanie z dodatkowymi szczegółami. –

Odpowiedz

8

Użyj listowych:

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

"Lista" na końcu jest niepotrzebna i jest oceniana dla każdego przedmiotu, nie tylko raz. – FogleBird

+0

Dobra uwaga, dziękuję za korektę! –

+2

Twoje rozumienie nie zajmuje się list = Brak –

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()) 

Można nawet wyodrębnić czynności do zrobienia:

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) 

Edit od Oli: Albo pójść dalej:

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

Może naprawdę chcesz ML. :) –

+0

Dodano kolejną warstwę zdzierania. Przetwarzanie może (i prawdopodobnie powinno) zostać wykonane na zewnątrz. I będę musiał wrócić, abym mógł wyciąć "inny", ochronny styl. – Oli

4

Mniejsza, bardziej zwarta:

for i in my_list: 
    # got a list 
if not my_list: 
    # not a list 

przy założeniu, że nie zmieniasz długości listy w pętli.

Edit od Oli: Aby wyrównać moje obawy użycia pamięci, to chcą with ing:

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

Ale tak, że jest całkiem prosty sposób wokół tego problemu.

2

Jeśli twoje działania są inny, chciałbym zrobić:

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

Jeśli twoje działania są podobną, to jest piękniejsze:

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

lub, jeśli możesz mieć None jako elementu listy,

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

podstawie innych odpowiedzi, myślę najczystsze rozwiązania są

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

lub rozumienie equiv

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

Myślę, że Twój sposób jest w porządku w ogólnym przypadku, ale możesz rozważyć takie podejście:

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 

Czy to pomaga? Tak, wiem, że jesteśmy dwa lata od potrzeby :-)

+1

To nie zadziała, jeśli ostatni element w get_list() jest w rzeczywistości "Brak". – Danosaure

Powiązane problemy