2010-11-21 1 views
1

Je continue d'avoir à faire cette opération partout dans mon code python. Je suis prêt à parier qu'il existe une façon plus facile (une ligne) de le faire. En fait, je n'ai pas besoin de "résultats" ailleurs, et je ne devrais exécuter "getResults" qu'une seule fois.Est-il possible de vérifier qu'une liste n'est pas vide avant de saisir le premier élément en utilisant le moins de lignes possibles en Python?

Des idées?

+0

Sachez aussi que dans les lignes directrices de style Python recommandées ([PEP 8] (http://www.python.org/dev/peps/pep-0008/)), la méthode devrait être nommé 'get_results' plutôt que' getResults'. –

Répondre

8

Vous n'avez pas spécifié ce result devrait être si results est vide, mais ceci est une option (en supposant que Python 2.6 ou supérieur):

result = results[0] if results else None 
+0

+1 C'est la bonne façon de faire cela. – katrielalex

2

result = len(results) and results[0] or None. Dans le cas où les résultats [0] ne sont pas 0, ou False, ou tout conteneur vide [],(), '', {}, set(), ....

+0

Je pense que vous devriez préciser que ceci ne fonctionnera que si 'results [0]' évalue à 'True'. Si 'results == range (10)', disons, cela donnera None. – katrielalex

+0

@katrielex mon commentaire (la deuxième phrase dans le post) ne le rend pas clair? – khachik

+0

@khachik: non. _Any_ empty container évalue à False - 'set()', 'tuple()', '{}', 'frozenset()', '0.0', ... - il échouera pour _any_ de ceux-ci. – katrielalex

0

Si vous n'avez pas vraiment besoin de results n'importe où, considérez une fonction qui renvoie uniquement le premier résultat, et l'utilisez à la place.

def getFirstResult(): 
    results = getResults() 
    if len(results) > 0: 
     return results[0] 
    else: 
     return None 
0

Si vous pouvez changer getResults() légèrement le long de ces lignes:

def getResults(): 
    # ... 
    getResults.seq = ... # save results in a func attribute 
    return getResults.seq 

Il vous permettra d'écrire:

results = getResults.seq[0] if getResults() else None 
+0

getResults est juste un exemple. Ce serait en fait une fonction différente chaque fois que je l'utiliserais, et je ne veux pas avoir à écrire un wrapper pour chaque fois que je l'utilise. –

+0

@Joehillen: Ce n'est pas un wrapper, c'est un changement permanent de la fonction elle-même qui est rétrocompatible avec l'utilisation précédente mais qui permet aussi d'utiliser l'exemple d'un one-liner quand on le souhaite. Il est également possible de le faire sans modifier la fonction - voir la question [façon pythonique de réécrire une assignation dans une instruction if] (http://stackoverflow.com/questions/3744382/pythonic-way-to-rewrite-an- affectation-dans-une-si-déclaration). – martineau

1

next(iter(getResults()), None) pour Python 2.6

Questions connexes