Как получить n-й элемент списка python или по умолчанию, если он недоступен

Я ищу эквивалент в python словаря .get(key, default) для списков. Есть ли какой-либо один иеромат лайнера, чтобы получить n-й элемент списка или значение по умолчанию, если оно недоступно?

Например, учитывая список myList, я хотел бы получить myList [0] или 5, если myList - пустой список.

Ответ 1

x[index] if len(x) > index else default

для поддержки отрицательных индексов, которые мы можем использовать:

x[index] if -len(l) <= index < len(l) else default

Ответ 2

try:
   a = b[n]
except IndexError:
   a = default

Изменить: я удалил чек для TypeError - возможно, лучше, чтобы вызывающий вызывал это.

Ответ 3

(a[n:]+[default])[0]

Это, вероятно, лучше, так как a становится больше

(a[n:n+1]+[default])[0]

Это работает, потому что если a[n:] - пустой список, если n => len(a)

Вот пример того, как это работает с range(5)

>>> range(5)[3:4]
[3]
>>> range(5)[4:5]
[4]
>>> range(5)[5:6]
[]
>>> range(5)[6:7]
[]

И полное выражение

>>> (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

Ответ 4

Просто подумал, что:

next(iter(myList), 5)

iter(l) возвращает итератор на myList, next() потребляет первый элемент итератора и вызывает ошибку StopIteration, за исключением тех случаев, когда вызывается со значением по умолчанию, что здесь и здесь, вторым аргументом, 5

Это работает только тогда, когда вам нужен 1-й элемент, который имеет место в вашем примере, но не в тексте вашего вопроса, поэтому...

Additionnaly, ему не нужно создавать временные списки в памяти, и он работает для любого типа итерации, даже если у него нет имени (см. комментарий Xiong Chiamiov о gruszczy ответе)

Ответ 5

(L[n:n+1] or [somedefault])[0]

Ответ 6

... ищет эквивалент в python dict.get(key, default) для списков

Существует itertools recipes, который делает это для общих итераций. Вот реализация этого рецепта под названием nth:

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(islice(iterable, n, None), default)

Для удобства вы можете установить и импортировать библиотеку, которая реализует такие рецепты для вас, например. more_itertools:

import more_itertools as mit

mit.nth([0, 1, 2], 1)
# 1    

Этот инструмент ведет себя аналогично list.index() или __getitem__(), но генератор nth предоставляет необязательный параметр по умолчанию и работает с общими итерами:

mit.nth([0, 1, 2], 3, "some_default")                      # default keyword
# 'some_default'

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