programing

한 줄의 머리와 꼬리

nasanasas 2020. 10. 4. 11:31
반응형

한 줄의 머리와 꼬리


단일 명령에서 첫 번째 요소의 목록과 "꼬리"의 압축을 푸는 파이썬적인 방법이 있습니까?

예를 들면 :

>> 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()기본값이있는 선택적 두 번째 인수를 사용하므로 head 요소가없는 경우 next(it, None)제공합니다 None.

당연히 목록에서 작업하는 경우 3.x 구문이없는 가장 쉬운 방법은 다음과 같습니다.

head, tail = seq[0], seq[1:]

>>> mylist = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> head, tail = mylist[0], mylist[1:]
>>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]

그러나 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 개의 파티션을 순진하게 병합합니다.


람다를 사용하는 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]

@GarethLattyPython 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]

If you need it to be exception-proof (i.e. supporting empty list), then add:

t=iter([]);h,t = ([(h,list(t)) for h in t]+[(None,[])])[0]

If you want to do it without the semicolon, use:

h,t = ([(h,list(t)) for t in [iter([1,2,3,4])] for h in t]+[(None,[])])[0]

참고URL : https://stackoverflow.com/questions/10532473/head-and-tail-in-one-line

반응형