답변:
l[index] if index < len(l) else default
부정적인 지수를 지원하기 위해 다음을 사용할 수 있습니다.
l[index] if -len(l) <= index < len(l) else default
index == -1000000
반환해야합니다 default
.
x[index] if 0 <= index < len(x) else default
일 index
수 있다면 더 좋을 것 입니다.
valid_index()
이 잘못되었습니다. 음수 인덱스 는 파이썬에서 합법적입니다 -len(l) <= index < len(l)
.
try:
a = b[n]
except IndexError:
a = default
편집 : TypeError 검사를 제거했습니다. 호출자가이를 처리하도록하는 것이 좋습니다.
(a[n:]+[default])[0]
a
커질 수록 아마도 더 낫 습니다.
(a[n:n+1]+[default])[0]
if 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(lst[i:i+1]), default)
-추악한 추악한 원 라이너 경쟁의 또 다른 항목.
방금 발견했습니다 :
next(iter(myList), 5)
iter(l)
에 반복자를 반환 myList
, next()
반복자의 첫 번째 요소를 소비하고, 제기 StopIteration
, 여기에 두 번째 인수의 경우 디폴트 값, 호출하는 경우를 제외하고 오류를5
이것은 첫 번째 요소를 원할 때만 작동합니다.이 예제에서는 그렇습니다. 그러나 질문 텍스트에는 없습니다.
또한 메모리에 임시 목록을 만들 필요가 없으며 이름이 없어도 반복 가능한 유형으로 작동합니다 (gruszczy의 답변에 대한 Xiong Chiamiov의 의견 참조)
next(iter(myList[n:n+1]), 5)
이제 n
th 요소에 작동합니다 .
try
변형 한 라이너 (OP에 의해 요청 문의) 없습니다. myList
OP로 지정된 목록이기 때문에 목록에서만 작동합니다 (정확히 말하면 색인 가능한 것입니다). 여기에 하나의 (또는 없음) 요소 목록을 작성하기 때문에 메모리에 사본을 작성하는 것은 비용이 많이 들지 않습니다. 물론 약간의 오버 헤드가 있지만 루프에서 수백만 번 그렇게하지 않으면 언급 할 가치가 없습니다. Btw, 나는 IndexError
예외를 만들고 잡는 것이 아마도 더 비싸다고 생각 합니다.
(L[n:n+1] or [somedefault])[0]
[] or ...
입니다. 그러나, 나는 (초보자를 위해) 쉽게 읽을 수 있기 때문에 개인적으로 받아 들여진 솔루션을 사용하고 싶습니다. 물론, 주석으로 'def'로 감싸면 크게 문제가되지 않습니다.
L[n] == False
나 L[n] == None
또는 L[n] == []
이상 전 세계적으로 어떤 false로 평가인가?
[False]
사실입니다.
myval = l[n:n+1] or [somedefault]
잘 작동 할 것 같아요 ?
... 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()
도구는 누락 된 인덱스에 대한 기본값을 반환합니다. 일반적인 iterables에 적용됩니다 :
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