Je cherche un équivalent dans python de dictionary.get(key, default)
pour les listes. Existe-t-il un langage unique pour obtenir le nième élément d’une liste ou une valeur par défaut s’il n’est pas disponible?
Par exemple, étant donné une liste myList, j'aimerais obtenir myList[0]
, ou 5 ifmyList
est une liste vide.
Merci.
l[index] if index < len(l) else default
Pour supporter les indices négatifs, nous pouvons utiliser:
l[index] if -len(l) <= index < len(l) else default
try:
a = b[n]
except IndexError:
a = default
Edit: J'ai enlevé la vérification de TypeError - il est probablement préférable de laisser l'appelant gérer cela.
(a[n:]+[default])[0]
C’est probablement mieux car a
s’agrandit
(a[n:n+1]+[default])[0]
Cela fonctionne parce que si a[n:]
est une liste vide si n => len(a)
Voici un exemple de la façon dont cela fonctionne avec range(5)
>>> range(5)[3:4]
[3]
>>> range(5)[4:5]
[4]
>>> range(5)[5:6]
[]
>>> range(5)[6:7]
[]
Et la pleine expression
>>> (range(5)[3:4]+[999])[0]
3
>>> (range(5)[4:5]+[999])[0]
4
>>> (range(5)[5:6]+[999])[0]
999
>>> (range(5)[6:7]+[999])[0]
999
Je viens de découvrir que:
next(iter(myList), 5)
iter(l)
renvoie un itérateur sur myList
, next()
consomme le premier élément de l'itérateur et génère une erreur StopIteration
sauf si elle est appelée 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, alors ...
De plus, il n'a pas besoin de créer de listes temporaires en mémoire et cela fonctionne pour tout type de résultat, même s'il n'a pas de nom (voir le commentaire de Xiong Chiamiov sur la réponse de gruszczy)
(L[n:n+1] or [somedefault])[0]
... cherche un équivalent dans python de
dict.get(key, default)
pour les listes
Il existe un recettes d'itertools qui le fait pour les iterables générales. 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
_import more_itertools as mit
mit.nth([1, 2, 3], 0)
# 1
mit.nth([], 0, 5)
# 5
_
Détail
Voici l'implémentation de la recette nth
:
_def nth(iterable, n, default=None):
"Returns the nth item or a default value"
return next(itertools.islice(iterable, n, None), default)
_
Comme dict.get()
, cet outil renvoie une valeur par défaut pour les index manquants. Cela s'applique aux iterables généraux:
_mit.nth((0, 1, 2), 1) # Tuple
# 1
mit.nth(range(3), 1) # range generator (py3)
# 1
mit.nth(iter([0, 1, 2]), 1) # list iterator
# 1
_
Utilisation de contextlib.suppress(exceptions)
de Python 3.4> pour créer une méthode getitem()
similaire à getattr()
.
import contextlib
def getitem(iterable, index, default=None):
"""Return iterable[index] or default if IndexError is raised."""
with contextlib.suppress(IndexError):
return iterable[index]
return default
En combinant @ Joachim avec ce qui précède, vous pouvez utiliser
next(iter(my_list[index:]), default)
Exemples:
next(iter(range(10)[8:]), 11)
8
>>> next(iter(range(10)[12:]), 11)
11
Ou peut-être plus clair, mais sans le len
my_list[index] if my_list[index:] else default