Ответ 1
x[index] if len(x) > index else default
для поддержки отрицательных индексов, которые мы можем использовать:
x[index] if -len(l) <= index < len(l) else default
Я ищу эквивалент в python словаря .get(key, default) для списков. Есть ли какой-либо один иеромат лайнера, чтобы получить n-й элемент списка или значение по умолчанию, если оно недоступно?
Например, учитывая список myList, я хотел бы получить myList [0] или 5, если myList - пустой список.
x[index] if len(x) > index else default
для поддержки отрицательных индексов, которые мы можем использовать:
x[index] if -len(l) <= index < len(l) else default
try:
a = b[n]
except IndexError:
a = default
Изменить: я удалил чек для TypeError - возможно, лучше, чтобы вызывающий вызывал это.
(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
Просто подумал, что:
next(iter(myList), 5)
iter(l)
возвращает итератор на myList
, next()
потребляет первый элемент итератора и вызывает ошибку StopIteration
, за исключением тех случаев, когда вызывается со значением по умолчанию, что здесь и здесь, вторым аргументом, 5
Это работает только тогда, когда вам нужен 1-й элемент, который имеет место в вашем примере, но не в тексте вашего вопроса, поэтому...
Additionnaly, ему не нужно создавать временные списки в памяти, и он работает для любого типа итерации, даже если у него нет имени (см. комментарий Xiong Chiamiov о gruszczy ответе)
(L[n:n+1] or [somedefault])[0]
... ищет эквивалент в 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