튜플 목록에서 n 번째 요소를 추출하는 방법은 무엇입니까?


112

튜플 목록에서 n 번째 요소를 얻으려고합니다.

다음과 같은 것이 있습니다.

elements = [(1,1,1),(2,3,7),(3,5,10)]

각 튜플의 두 번째 요소 만 목록으로 추출하고 싶습니다.

seconds = [1, 3, 5]

나는 for루프로 할 수 있다는 것을 알고 있지만 수천 개의 튜플을 가지고 있기 때문에 다른 방법이 있는지 알고 싶었습니다.

답변:


185
n = 1 # N. . .
[x[n] for x in elements]

34

이것은 또한 작동합니다 :

zip(*elements)[1]

(나는 주로 이것을 게시하고 있으며, 내가 그랬음을 스스로 증명하기 위해 zip...)

실제 사용 방법 :

>>> help(zip)

내장 된 모듈에 내장 된 함수 zip에 대한 도움말 :

지퍼(...)

zip (seq1 [, seq2 [...]])-> [(seq1 [0], seq2 [0] ...), (...)]

튜플 목록을 반환합니다. 여기서 각 튜플은 각 인수 시퀀스의 i 번째 요소를 포함합니다. 리턴 된 목록은 가장 짧은 인수 시퀀스의 길이까지 잘립니다.

>>> elements = [(1,1,1),(2,3,7),(3,5,10)]
>>> zip(*elements)
[(1, 2, 3), (1, 3, 5), (1, 7, 10)]
>>> zip(*elements)[1]
(1, 3, 5)
>>>

오늘 배운 깔끔한 것 : *list인수에 사용하여 함수에 대한 매개 변수 목록을 만듭니다 ...

참고 : Python3에서는 zip반복자 list(zip(*elements))를 반환 하므로 대신 튜플 목록을 반환하는 데 사용하십시오.


2
그리고 **dict키워드 인수를 만드는 데 사용 합니다. def test(foo=3, bar=3): return foo*barthend = {'bar': 9, 'foo'=12}; print test(**d)
Wayne Werner

@ 웨인 베르너 : 네. 이 물건은 모든 단지 수동적 인 지식 (내가 자주 사용하지 않는)이었다 - 그러나 당신이 알 수 있도록 그것의 좋은 이제 다음 상기시켜 위치를 / 무엇을 찾아야할지 ...
다렌 토마스

1
실화 - 난 아무것도에 내가 자주 사용하는 것이 발견 (파이썬, 정력), I는 깔끔한 / 쿨의 필요 알림 경향 내가 그들을 사용하지 않기 때문에 내가 잊어 버린 것을 특징 것을 자주.
Wayne Werner

* list 구문은 매우 유용합니다. 이것이 공식 파이썬 문서에서 어디에 설명되어 있는지 아십니까?
user1748155

난 단지 튜토리얼에서 그것을 발견 : docs.python.org/2/tutorial/...
다렌 토마스에게

30

FOR로 할 수 있다는 것을 알고 있지만 다른 방법이 있는지 알고 싶었습니다.

다른 방법이 있습니다. mapitemgetter 로도 할 수 있습니다 .

>>> from operator import itemgetter
>>> map(itemgetter(1), elements)

이것은 여전히 ​​내부적으로 루프를 수행하며 목록 이해력보다 약간 느립니다.

setup = 'elements = [(1,1,1) for _ in range(100000)];from operator import itemgetter'
method1 = '[x[1] for x in elements]'
method2 = 'map(itemgetter(1), elements)'

import timeit
t = timeit.Timer(method1, setup)
print('Method 1: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup)
print('Method 2: ' + str(t.timeit(100)))

결과 :

방법 1 : 1.25699996948
방법 2 : 1.46600008011

목록을 반복해야하는 경우 a를 사용하는 for것이 좋습니다.


2
약간의 추가 : python-3.x에서 벤치 마크는지도가 밀리 초의 몇 분의 1에 불과하다는 것을 보여줄 것입니다. 반복자를 반환하기 때문입니다. method2 = 'list (map (itemgetter (1), elements))'는 이전 동작을 렌더링합니다.
Maik Beckmann

12

2- 튜플 목록의 두 번째 요소를 가져 오는 것이 가장 빠른 방법을 검색하면서 이것을 발견했습니다. 내가 원하는 것이 아니라 세 번째 방법으로 표시된 것과 동일한 테스트를 실행하고 zip 방법을 테스트하십시오.

setup = 'elements = [(1,1) for _ in range(100000)];from operator import itemgetter'
method1 = '[x[1] for x in elements]'
method2 = 'map(itemgetter(1), elements)'
method3 = 'dict(elements).values()'
method4 = 'zip(*elements)[1]'

import timeit
t = timeit.Timer(method1, setup)
print('Method 1: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup)
print('Method 2: ' + str(t.timeit(100)))
t = timeit.Timer(method3, setup)
print('Method 3: ' + str(t.timeit(100)))
t = timeit.Timer(method4, setup)
print('Method 4: ' + str(t.timeit(100)))

Method 1: 0.618785858154
Method 2: 0.711684942245
Method 3: 0.298138141632
Method 4: 1.32586884499

따라서 dict로 변환하고 값을 가져 오는 2 개의 튜플 쌍이 있으면 두 배 이상 빠릅니다.


이것은 아마도 분명하지만 dict(elements).values()목록 비교 또는지도와는 반대로 단일 요소 사전이 생성 될 것이라고 언급 할 것입니다. 이것은 정확히 내가 원했던 것입니다 (독특한 touples에 관심이있었습니다) (+1 및 게시에 대한 큰 감사).하지만 다른 사람들은 dict가 더 빠른 이유를 궁금해 할 것입니다. 메모리를 할당하지 않고 기존 요소에 대해서만 확인합니다.
Greg0ry

6

2- 튜플 목록에서 두 번째 요소를 추출 하기위한 Python 3.6의 타이밍 .

또한 numpy읽기가 더 간단한 배열 메서드가 추가되었습니다 (하지만 목록 이해력보다 더 간단합니다).

from operator import itemgetter
elements = [(1,1) for _ in range(100000)]

%timeit second = [x[1] for x in elements]
%timeit second = list(map(itemgetter(1), elements))
%timeit second = dict(elements).values()
%timeit second = list(zip(*elements))[1]
%timeit second = np.array(elements)[:,1]

및 타이밍 :

list comprehension:  4.73 ms ± 206 µs per loop
list(map):           5.3 ms ± 167 µs per loop
dict:                2.25 ms ± 103 µs per loop
list(zip)            5.2 ms ± 252 µs per loop
numpy array:        28.7 ms ± 1.88 ms per loop

map()zip()더 이상 목록을 반환하지 않는, 따라서 명시 적 변환.



1

islice및 사용 chain.from_iterable:

>>> from itertools import chain, islice
>>> elements = [(1,1,1),(2,3,7),(3,5,10)]
>>> list(chain.from_iterable(islice(item, 1, 2) for item in elements))
[1, 3, 5]

이는 둘 이상의 요소가 필요할 때 유용 할 수 있습니다.

>>> elements = [(0, 1, 2, 3, 4, 5), 
                (10, 11, 12, 13, 14, 15), 
                (20, 21, 22, 23, 24, 25)]
>>> list(chain.from_iterable(islice(tuple_, 2, 5) for tuple_ in elements))
[2, 3, 4, 12, 13, 14, 22, 23, 24]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.