2009-10-07 9 views
20

J'ai écrit beaucoup de constructions comme ça les deux derniers jours:Pour une liste à moins vide 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 

Lot de ferraille et j'assignez la liste à une variable réelle (en gardant en mémoire plus longtemps que nécessaire). Python a simplifié beaucoup de mon code jusqu'à maintenant ... Y at-il un moyen facile de le faire?

(je crois comprendre que la else dans la for: else: construction déclenche toujours après avoir bouclé, vide ou non - donc pas ce que je veux)

+2

Je ne suis pas sûr que tout ** pourrait ** être plus facile. Quel est le problème avec ça? Quelle ligne de code souhaitez-vous éliminer? –

+0

Bien ...Idéalement, je voudrais arrêter d'assigner la liste à une variable et compacter le if/else dans une partie de la (je sais que c'est peu probable). Je pourrais utiliser 'avec get_list() comme liste:', mais cela pousse les choses plus loin – Oli

+1

@Oli: S'il vous plaît ne pas commenter sur votre propre question. S'il vous plaît * mettre à jour * votre question avec des détails supplémentaires. –

Répondre

8

Utilisez une compréhension de la liste:

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" if list "à la fin est inutile et est évaluée pour chaque élément, pas seulement une fois. – FogleBird

+0

Bon point, merci pour la correction! –

+2

Votre compréhension ne gère pas 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()) 

Vous pouvez même extraire les actions à faire:

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) 

Modifier de Oli: Ou aller un autre:

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

Peut-être que vous voulez vraiment ML. :) –

+0

Ajout d'une autre couche de down-stripping. Le traitement peut (et doit probablement) être fait de l'extérieur. Et je devrai retourner pour que je puisse couper le 'else', le style de garde – Oli

4

Slighty plus laconique est la suivante:

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

en supposant que vous ne changez pas la longueur de la liste dans la boucle.

Modifier de Oli: Pour compenser mes soucis d'utilisation de la mémoire, il voudrait with ING:

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

Mais oui, c'est tout à fait un moyen simple autour de la question.

2

Si vos actions sont différentes, je le ferais:

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

Si vos actions sont similaires, ce qui est plus belle:

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

ou, si vous pourriez avoir None comme élément de la liste,

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

Sur la base des autres réponses, je pense que les plus propres solutions sont

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

ou la compréhension équiv

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

Je pense que votre chemin est correct dans le cas général, mais vous pouvez envisager cette approche:

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 

Cela aide-t-il? Oui, je sais que nous sommes à deux ans de la nécessité :-)

+1

Cela ne fonctionnera pas si le dernier élément de get_list() est en fait 'None'. – Danosaure

Questions connexes