파이썬 목록의 n 번째 요소를 얻는 방법 또는 사용할 수없는 경우 기본값


144

파이썬 dictionary.get(key, default)에서 목록에 해당하는 것을 찾고 있습니다. 목록의 n 번째 요소를 가져 오는 라이너 이디엄이 있습니까?

예를 들어 myList 목록을 얻으려면을 얻 myList[0]거나 5 myList가 비어있는 목록입니다.

감사.

답변:


124
l[index] if index < len(l) else default

부정적인 지수를 지원하기 위해 다음을 사용할 수 있습니다.

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

3
목록에 이름이없는 경우 (예 : 목록 이해에서) 작동하지 않습니다.
Xiong Chiamiov

9
음수 지수의 경우를 잊어 버린 것 같습니다. 예 : index == -1000000반환해야합니다 default.
nodakai

3
@ 노다 카이, 좋은 지적. 나는 때때로 이것에 물렸다. 부정적 x[index] if 0 <= index < len(x) else defaultindex수 있다면 더 좋을 것 입니다.
Ben Hoyt

3
@nodakai wow-테스트를 ​​올바르게 코딩하여 실패하지 않도록 try / except를 사용하는 것이 더 좋은 이유의 훌륭한 예입니다. 나는 시도 / 제외에 의존하는 것을 좋아하지 않는다. 내가 일어날 것이라는 것을 알고 있지만, 이것은 그것을 고려할 의지를 증가시킨다.
ToolmakerSteve

6
@ToolmakerSteve :에 대한 수식 valid_index()이 잘못되었습니다. 음수 인덱스 파이썬에서 합법적입니다 -len(l) <= index < len(l).
Tim Pietzcker

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

편집 : TypeError 검사를 제거했습니다. 호출자가이를 처리하도록하는 것이 좋습니다.


3
나는 이것을 좋아한다. iterable을 인수로 사용하여 호출 할 수 있도록 함수를 감싸십시오. 더 쉽게 읽을 수 있습니다.
Noufal Ibrahim

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

5
설명없이 주석없이 실제 코드로 작성 하시겠습니까?
피터 한센

1
@Peter Hansen, 내가 골프를 타는 경우에만;) 그러나 그것은 모든 버전의 Python 에서 작동합니다 . 수락 된 답변은 2.5+ 이상에서만 작동
John La Rooy

3
하지만 3 개의 임시 목록을 만들고 2 개의 인덱스에 액세스하여 항목을 선택합니다.
Joachim Jablon

"실제"코드에서는이 작업을 수행하지 않았지만, 파이썬 REPL에서 쉽게 사용할 수있는 간결한 간결한 라이너입니다.
Cookyt

next(iter(lst[i:i+1]), default)-추악한 추악한 원 라이너 경쟁의 또 다른 항목.
jfs

28

방금 발견했습니다 :

next(iter(myList), 5)

iter(l)에 반복자를 반환 myList, next()반복자의 첫 번째 요소를 소비하고, 제기 StopIteration, 여기에 두 번째 인수의 경우 디폴트 값, 호출하는 경우를 제외하고 오류를5

이것은 첫 번째 요소를 원할 때만 작동합니다.이 예제에서는 그렇습니다. 그러나 질문 텍스트에는 없습니다.

또한 메모리에 임시 목록을 만들 필요가 없으며 이름이 없어도 반복 가능한 유형으로 작동합니다 (gruszczy의 답변에 대한 Xiong Chiamiov의 의견 참조)


3
다른 답변과 함께 : next(iter(myList[n:n+1]), 5) 이제 nth 요소에 작동합니다 .
Alfe

목록이 아닌 경우에는 작동하지 않습니다. 이 시점에서, IndexError를 제외하고는 더 좋은 아이디어 IMHO처럼 읽습니다. 또한 메모리에 목록을 만듭니다.
Joachim Jablon

try변형 한 라이너 (OP에 의해 요청 문의) 없습니다. myListOP로 지정된 목록이기 때문에 목록에서만 작동합니다 (정확히 말하면 색인 가능한 것입니다). 여기에 하나의 (또는 없음) 요소 목록을 작성하기 때문에 메모리에 사본을 작성하는 것은 비용이 많이 들지 않습니다. 물론 약간의 오버 헤드가 있지만 루프에서 수백만 번 그렇게하지 않으면 언급 할 가치가 없습니다. Btw, 나는 IndexError예외를 만들고 잡는 것이 아마도 더 비싸다고 생각 합니다.
Alfe

readability counts :) IndexError를 발생시키는 데 상당한 비용이 드는 시점에 있다면 파이썬에서 모든 일을 수행해야 할 것입니다.
Joachim Jablon

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

1
+1로 인해 내가 한 일을 배우게 되었기 때문 [] or ...입니다. 그러나, 나는 (초보자를 위해) 쉽게 읽을 수 있기 때문에 개인적으로 받아 들여진 솔루션을 사용하고 싶습니다. 물론, 주석으로 'def'로 감싸면 크게 문제가되지 않습니다.
ToolmakerSteve

어떤 경우 L[n] == FalseL[n] == None또는 L[n] == []이상 전 세계적으로 어떤 false로 평가인가?
Joachim Jablon

@JoachimJablon : 여전히 작동합니다. 슬라이스는 목록을 반환하며 [False]사실입니다.
Ignacio Vazquez-Abrams

아, 실제로 목록이 확인되었고 값이 아니라는 것을 알지 못했습니다.
Joachim Jablon

왜 이것을 튜플로 감쌀까요? myval = l[n:n+1] or [somedefault]잘 작동 할 것 같아요 ?
Rotareti

8

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

2

저렴한 솔루션은 실제로 다음과 같이 열거하고 .get()평소와 같이 사용하여 받아들입니다.

 dict(enumerate(l)).get(7, my_default)

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

1

Python 3.4를 사용하여 와 유사한 메소드 contextlib.suppress(exceptions)를 빌드하십시오 .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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.