단일 명령으로 첫 번째 요소의 목록과 "꼬리"의 압축을 푸는 파이썬적인 방법이 있습니까?
예를 들면 :
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
단일 명령으로 첫 번째 요소의 목록과 "꼬리"의 압축을 푸는 파이썬적인 방법이 있습니까?
예를 들면 :
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
답변:
Python 3.x에서는 다음과 같이 멋지게 수행 할 수 있습니다.
>>> head, *tail = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
3.x의 새로운 기능은 *
추가 값을 의미하기 위해 압축을 풀 때 연산자 를 사용하는 것 입니다. PEP 3132-Extended Iterable Unpacking에 설명되어 있습니다. 또한 시퀀스뿐만 아니라 반복 가능한 모든 작업을 수행 할 수있는 이점이 있습니다.
또한 정말 읽기 쉽습니다.
PEP에 설명 된대로 2.x에서 (잠재적으로 임시 목록을 만들지 않고) 동등한 작업을 수행하려면 다음을 수행해야합니다.
it = iter(iterable)
head, tail = next(it), list(it)
주석에서 언급했듯이 이것은 head
예외를 던지는 대신 기본값을 얻을 수있는 기회를 제공합니다 . 이 동작을 원하면 next()
기본값이있는 선택적 두 번째 인수를 사용하므로 헤드 요소가없는 경우 next(it, None)
제공합니다 None
.
당연히 목록에서 작업하는 경우 3.x 구문이없는 가장 쉬운 방법은 다음과 같습니다.
head, tail = seq[0], seq[1:]
__getitem__
/ __setitem__
느리게 꼬리 작업을 할 수 있지만, 내장 된 목록은하지 않습니다.
python 3.x
그러나 O (1) head,tail
작업의 복잡성을 위해 사용해야합니다 deque
.
다음 방법 :
from collections import deque
l = deque([1,2,3,4,5,6,7,8,9])
head, tail = l.popleft(), l
목록의 모든 요소를 반복해야 할 때 유용합니다. 예를 들어 병합 정렬에서 2 개의 파티션을 순진하게 병합합니다.
head, tail = l.popleft(), l
~ O (1)입니다. head, tail = seq[0], seq[1:]
O (n)입니다.
head = l.popleft()
과 tail
단지의 별칭입니다 l
. 만약 l
변경 tail
도 변경됩니다.
람다를 사용하는 Python 2
>>> head, tail = (lambda lst: (lst[0], lst[1:]))([1, 1, 2, 3, 5, 8, 13, 21, 34, 55])
>>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
head, tail = lst[0], lst[1:]
하시겠습니까? 영업 수단은 문자를 사용하는 경우, 그는 수동으로 머리와 꼬리 나눌 수head, tail = 1, [1, 2, 3, 5, 8, 13, 21, 34, 55]
lst = ...
이전 줄에서는 불가능 ). (2) Doing head, tail = lst[0], lst[1:]
은 코드를 부작용에 노출시키고 (고려 head, tail = get_list()[0], get_list()[1:]
) Op의 형태와는 다릅니다 head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
.
@GarethLatty 의 Python 2 솔루션을 기반으로 빌드 한 다음은 Python 2에서 중간 변수없이 한 줄에 해당하는 값을 얻는 방법입니다.
t=iter([1, 1, 2, 3, 5, 8, 13, 21, 34, 55]);h,t = [(h,list(t)) for h in t][0]
예외를 방지해야하는 경우 (예 : 빈 목록 지원) 다음을 추가합니다.
t=iter([]);h,t = ([(h,list(t)) for h in t]+[(None,[])])[0]
세미콜론없이 수행하려면 다음을 사용하십시오.
h,t = ([(h,list(t)) for t in [iter([1,2,3,4])] for h in t]+[(None,[])])[0]