Python의 단일 요소 목록에서 요소 만 가져 오나요?


83

Python 목록이 항상 단일 항목을 포함하는 것으로 알려진 경우 다음과 다른 방법으로 액세스 할 수있는 방법이 있습니까?

mylist[0]

당신은 '왜 당신은 원하십니까?'라고 물을 수 있습니다. 호기심 만. 파이썬에서 모든 것을 할 수있는 다른 방법이있는 것 같습니다 .


5
대안이있을 수 있지만 일반적 으로이를 수행하는 확실한 방법은 하나뿐입니다 .이 경우에는 이미 찾은 것 같습니다.
ekhumoro

항상 단일 항목을 포함하는 경우 a list가 최상의 데이터 유형이 아닐 수 있습니까?
데이비드 Zemens

13
@ekhumoro : 시퀀스에 요소가 하나만 있다는 가정을 확인하기 때문에 실제로 시퀀스 풀기 방법에 부분적입니다. mylist[0]요소가 하나 이상 있으면 성공하지만 실제로 요소가 30 개 있으면 불평하지 않습니다. singleitem, = mylist정확히 하나의 요소가 있는지 확인합니다.
ShadowRanger 2015 년

1
@ShadowRanger. 문제는 이미 단일 항목을 포함하는 것으로 알려진 목록의 유일한 요소에 액세스하는 것에 관한 것 입니다.
에쿠 모로

6
@ekhumoro : 동의하지 않습니다. 저는 방어 적으로 프로그래밍하는 것을 선호하기 때문에 요구 사항 위반은 조용히 전달되지 않습니다 (실패 할 수는 있지만 크게 실패하므로 미묘한 잘못된 동작보다 식별하고 수정하는 것이 훨씬 쉽습니다). 프로덕션 코드의 일부 "알려진"동작이 잘못된 것으로 판명 될 때마다 1 센트를 받았다면 ... 글쎄, 나는 아마도 부자 가 아닐 것입니다 .하지만 가족을 정말 좋은 곳 으로 데려 갈 수있을 것입니다. 공식 만찬.
ShadowRanger 2015 년

답변:


123

시퀀스 풀기 :

singleitem, = mylist
# Identical in behavior (byte code produced is the same),
# but arguably more readable since a lone trailing comma could be missed:
[singleitem] = mylist

반복기 프로토콜의 명시 적 사용 :

singleitem = next(iter(mylist))

파괴적인 팝 :

singleitem = mylist.pop()

음수 색인 :

singleitem = mylist[-1]

단일 반복을 통해 설정 for합니다 (루프가 종료 될 때 루프 변수가 마지막 값으로 계속 사용 가능하기 때문에) :

for singleitem in mylist: break

다른 많은 것 (위의 비트를 결합하거나 변경하거나 암시 적 반복에 의존)하지만 아이디어를 얻을 수 있습니다.


6
광기 때문에 주 답변에 포함 할 가치가 없음 : 단일 인수 함수에 대한 매개 변수 압축 해제 (최대 바보 값을 반환하는 익명 람다로 singleitem = (lambda x: x)(*mylist)
수행됨

6
첫 번째는 목록에 둘 이상의 요소가 포함 된 경우에도 발생한다는 점에서 고유합니다.
Neil G

7
첫 번째는 [singleitem] = mylist.
Carsten S

@NeilG : 슬프게도, 완전히 독특하지는 않습니다. 주석의 "격렬한 광기"버전도 그렇게합니다 (목록 구문을 통한 압축 해제와 마찬가지로 실제로는 첫 번째 예제 동작과 동일합니다). 지금은 좀 더럽습니다.
ShadowRanger 2015 년

1
@CarstenS : 일반적으로 []시퀀스 언 패킹 에 사용 하는 것이 눈살을 찌푸 리지만 (배티를 유발 for [i, x] in enumerate(iterable):합니다), 예, 단일 값을 언 패킹하는 경우 후행 쉼표를 쉽게 놓칠 수 있으며 가독성을 위해 괄호를 사용하는 것이 정당합니다. 나는 그것을 대답에 추가했습니다. 감사!
ShadowRanger 2015 년

20

more_itertools 라이브러리에 iterable에서 하나의 항목을 반환하는 도구가 있다고 추가하겠습니다 .

from more_itertools import one


iterable = ["foo"]
one(iterable)
# "foo"

또한 more_itertools.oneiterable이 비어 있거나 둘 이상의 항목이있는 경우 오류를 발생시킵니다.

iterable = []
one(iterable)
# ValueError: not enough values to unpack (expected 1, got 0)

iterable = ["foo", "bar"]
one(iterable)
# ValueError: too many values to unpack (expected 1)

more_itertools 타사 패키지입니다. > pip install more-itertools

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.