Je recherche un équivalent en python de dictionary.get(key, default)
for lists. Y a-t-il un idiome de ligne pour obtenir le nième élément d'une liste ou une valeur par défaut si elle n'est pas disponible?
Par exemple, étant donné une liste myList que je voudrais obtenir myList[0]
, ou 5 si myList
est une liste vide.
Merci.
index == -1000000
devrait revenirdefault
.x[index] if 0 <= index < len(x) else default
serait mieux siindex
peut jamais être négatif.valid_index()
est incorrecte. Les indices négatifs sont légaux en Python - cela devrait l'être-len(l) <= index < len(l)
.Edit: J'ai supprimé la vérification de TypeError - probablement mieux de laisser l'appelant gérer cela.
la source
C'est probablement mieux en
a
grossissantCela fonctionne car si
a[n:]
est une liste vide sin => len(a)
Voici un exemple de comment cela fonctionne avec
range(5)
Et la pleine expression
la source
next(iter(lst[i:i+1]), default)
- juste une autre entrée dans la compétition cryptique laid one-liners.Je viens de découvrir que:
iter(l)
renvoie un itérateur surmyList
,next()
consomme le premier élément de l'itérateur, et lève uneStopIteration
erreur sauf s'il est appelé avec une valeur par défaut, ce qui est le cas ici, le deuxième argument,5
Cela ne fonctionne que lorsque vous voulez le 1er élément, ce qui est le cas dans votre exemple, mais pas dans le texte de votre question, donc ...
De plus, il n'a pas besoin de créer de listes temporaires en mémoire et fonctionne pour tout type d'itérable, même s'il n'a pas de nom (voir le commentaire de Xiong Chiamiov sur la réponse de gruszczy)
la source
next(iter(myList[n:n+1]), 5)
maintenant cela fonctionne pour len
e élément.try
variante n'est pas une ligne unique (demandée par OP). Cela ne fonctionne que pour les listes car ilmyList
s'agit d'une liste telle que spécifiée par OP (pour être précis, c'est quelque chose d'indexable). Créer une copie en mémoire n'est pas coûteux ici car je crée ici une liste d'un seul élément (ou aucun). Bien sûr, un peu de surcharge, mais cela ne vaut pas la peine d'être mentionné à moins que vous ne le fassiez des millions de fois en boucle. Btw, je suppose que créer et attraper uneIndexError
exception est probablement plus coûteux.la source
[] or ...
fait. Cependant, personnellement, j'utiliserais simplement la solution acceptée, car elle se lit facilement (pour les novices). Certes, l'envelopper dans un «def» avec un commentaire en ferait largement un non-problème.L[n] == False
ouL[n] == None
ouL[n] == []
ou plus globalement tout ce qui Equivaut à Faux?[False]
est vraie.myval = l[n:n+1] or [somedefault]
cela fonctionnerait très bien?Il existe des recettes itertools qui le font pour les itérables généraux. Pour plus de commodité, vous pouvez
> pip install more_itertools
et importer cette bibliothèque tierce qui implémente de telles recettes pour vous:Code
Détail
Voici la mise en œuvre de la
nth
recette:Comme
dict.get()
, cet outil renvoie une valeur par défaut pour les index manquants. Elle s'applique aux itérables généraux:la source
Une solution bon marché consiste à créer un dict avec enumerate et à utiliser
.get()
comme d'habitude, commela source
En combinant @ Joachim avec ce qui précède, vous pouvez utiliser
Exemples:
Ou, peut-être plus clair, mais sans le
len
la source
Utiliser Python 3.4
contextlib.suppress(exceptions)
pour construire unegetitem()
méthode similaire àgetattr()
.la source