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



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



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



спасибо.

530   8  

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 = default

Edit: я удалил проверку на 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)

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

... ищем эквивалент в 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

или, может быть, более ясно, но без len

my_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

    Ничего не найдено.