Как получить N-й элемент списка Python или по умолчанию, если не доступен
Я ищу эквивалент в python dictionary.get(key, default) для списков. Есть ли какая-либо одна идиома лайнера, чтобы получить N-й элемент списка или значение по умолчанию, если оно недоступно?
например, учитывая список myList я хотел бы получить myList[0], или 5, еслиmyList - пустой список.
спасибо.
8 ответов:
l[index] if index < len(l) else defaultдля поддержки отрицательных индексов мы можем использовать:
l[index] if -len(l) <= index < len(l) else default
try: a = b[n] except IndexError: a = defaultEdit: я удалил проверку на 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-й элемент, который имеет место в вашем примере, но не в тексте вашего вопроса, так...
кроме того, ему не нужно создавать временные списки в память и она работает для любого типа итераций, даже если у нее нет имени (см. комментарий Xiong Chiamiov к ответу gruszczy)
... ищем эквивалент в python
dict.get(key, default)спискиесть модуле itertools рецепты это делает это для общих итераций. Для удобства, вы можете
> pip install more_itertoolsи импортировать стороннюю библиотеку, которая реализует такие рецепты для вас:код
import more_itertools as mit mit.nth([1, 2, 3], 0) # 1 mit.nth([], 0, 5) # 5
деталь
здесь является реализацией
nthрецепт:def nth(iterable, n, default=None): "Returns the nth item or a default value" return next(itertools.islice(iterable, n, None), default)этот инструмент ведет себя как
dict.get()для общих итераций, со значениями по умолчанию для отсутствующих индексов.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
комбинируя @Joachim с вышеизложенным, вы можете использовать
next(iter(my_list[index:]), default)примеры:
next(iter(range(10)[8:]), 11) 8 >>> next(iter(range(10)[12:]), 11) 11
или, может быть, более ясно, но без
lenmy_list[index] if my_list[index:] else default
С помощью Python 3.4 л!--1--> построить
getitem()аналогично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
Comments