web-dev-qa-db-fra.com

Comment obtenir le nième élément d'une liste python ou un défaut si non disponible

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.

125
user265454
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
106
gruszczy
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.

49
Tim Pietzcker
(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
26
John La Rooy

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)

23
Joachim Jablon
(L[n:n+1] or [somedefault])[0]
16

... 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  
_
4
pylang

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
1
Harvey

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
1
serv-inc