2009-10-07 9 views
20

he estado escribiendo un montón de construcciones como esta el último par de días:lista a menos vacía en 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 

montón de basura y asignar la lista a una variable real (manteniéndolo en la memoria más de lo necesario). Python ha simplificado una gran cantidad de mi código hasta ahora ... ¿Hay una manera fácil de hacer esto?

(Mi entendimiento es que el else en el for: else: constructo siempre desencadena después de que se ha enrollado, vacío o no - por lo que no es lo que quiero)

+2

No estoy seguro de que algo ** pueda ** ser más fácil. ¿Qué pasa con esto? ¿Qué línea de código te gustaría eliminar? –

+0

Bueno ...Idealmente, me gustaría dejar de asignar la lista a una variable y compactar el if/else en una parte de (por lo que sé que es poco probable). Podría usar 'with get_list() como list:', pero eso lleva más lejos – Oli

+1

@Oli: por favor, no comentes tu propia pregunta. Por favor * actualice * su pregunta con detalles adicionales. –

Respuesta

8

utilizar una lista de comprensión:

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

La" lista if "al final no es necesaria y se evalúa para cada elemento, no solo una vez. – FogleBird

+0

Buen punto, gracias por la corrección! –

+2

Sus comprensiones no manejan 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()) 

Incluso se puede extraer de las acciones a realizar:

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) 

Editar en Oli: O ir uno más:

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

Quizás realmente quieras ML. :) –

+0

Se agregó otra capa de stripping. El procesamiento puede (y probablemente algo) hacerse externamente. Y tendré que volver para poder cortar el 'else', guard-style – Oli

4

Ligeramente más concisa es:

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

suponiendo que no va a cambiar la longitud de la lista en el bucle.

Editar en Oli: Para compensar mis preocupaciones de uso de memoria, que querría with ING:

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

Pero sí, que es una manera muy simple en torno al tema.

2

Si sus acciones son diferente, lo haría:

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

Si sus acciones son similares, esto es más bella:

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

o, si es posible que tenga None como un elemento de la lista,

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

Sobre la base de las otras respuestas, creo que las soluciones más limpias son

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

o la comprensión equiv

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

Creo que su camino está bien en el caso general, pero puede considerar este enfoque:

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 

¿Eso ayuda? Sí, sé que estamos a dos años de la necesidad :-)

+1

Esto no funcionará si el último elemento en get_list() es realmente 'None'. – Danosaure

Cuestiones relacionadas