2013-07-10 3 views
3

Considérez ce codeobtenir premier élément d'une liste sans exception

description = "" 
desc = hxs.select('/html/head/meta[2]/@content').extract() 
if len(desc) > 0: 
    description = desc[0]  
item["description"] = description 

desc est une liste de chaînes. Si la liste est vide, la description est une chaîne vide, sinon ce sont les premiers éléments de la liste. Comment le rendre plus pythonique?

oublié de mentionner que je dois utiliser 2,7

Répondre

8

Vous pouvez écrire:

desc = hxs.select("/html/head/meta[2]/@content").extract() 
item["description"] = desc[0] if len(desc) > 0 else "" 

Comme indiqué dans les commentaires ci-dessous, vous pouvez également évaluer directement la liste dans un contexte booléen:

item["description"] = desc[0] if desc else "" 
+0

'si len (desc)> 0' pourrait être remplacé par' if len (desc) '. –

+0

@ Waleed, yup, il peut. Je me suis habitué à spécifier la condition entière puisque C# me force à le faire, mais il n'est en effet pas requis en Python. –

+6

@WaleedKhan ou simplement 'si desc ', puisque les listes vides sont fausses. –

1

Vous pouvez utiliser la gestion des exceptions (bien que ce soit plus détaillé que l'utilisation de l'expression conditionnelle).

desc = hxs.select('/html/head/meta[2]/@content').extract() 
try: 
    description = desc[0] 
except IndexError: 
    description = "" 
+0

Il peut être plus verbeux, mais cela ne signifie pas que c'est pire. Comme [les docs] (http://docs.python.org/3/glossary.html#term-eafp) disent: "Ce style de codage Python commun suppose l'existence de clés ou d'attributs valides et attrape des exceptions si l'hypothèse s'avère fausse Ce style propre et rapide est caractérisé par la présence de nombreuses propositions d'essai et d'exception, ce qui contraste avec le style LBYL commun à beaucoup d'autres langages tels que C. " – abarnert

+0

Dans ce cas, les deux approches sont si simples et lisibles que je choisirais probablement l'expression conditionnelle comme l'approche la plus courte :) – chepner

2

vous pouvez utiliser alternativement utiliser le fait que next supporte un défaut

item["description"] = next(iter(desc), "") 
0

Je ne pense pas que vous devriez vraiment faire dans votre cas, mais pour être complet ...

Pour un itérateur qui peut être vide, il vous suffit d'utiliser la valeur par défaut optionnelle pour next:

desc = foo.finditer(bar) 
item["description"] = next(desc, "") 

En attendant, vous pouvez toujours utiliser iter() pour "jeter un coup d'oeil" à l'itérateur que vous obtiendriez d'une séquence (ou d'une autre itérative non itérative).

Alors:

desc = foo.findall(bar) 
item["description"] = next(iter(desc), "") 

Je pense que cela est moins lisible que d'utiliser la liste comme une séquence (si vous utilisez réponse ou LYBL de Frédéric Hamidi de chepner EAFP) plutôt qu'un simple itérables. Après tout, nous avons l'API de séquence pour une raison.

Questions connexes