programing

튜플 리스트에서 n번째 요소를 추출하는 방법

javajsp 2023. 4. 24. 22:27

튜플 리스트에서 n번째 요소를 추출하는 방법

튜플 리스트에서 n번째 원소를 얻으려고 합니다.

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

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

각 태플의 두 번째 요소만 목록으로 추출합니다.

seconds = [1, 3, 5]

나는 그것이 할 수 있는 일이라는 것을 안다.for루프가 있는데 다른 방법이 있는지 알고 싶었어요. 수천 개의 튜플이 있으니까.

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

이것도 동작합니다.

zip(*elements)[1]

(주로 이 글을 올립니다.제가 이 글을 올린 것은 제가 이 책을 읽었다는 것을 증명하기 위해서입니다.zip...)

실제 상황 보기:

>>> help(zip)

모듈 내장형 zip-in 기능에 대한 도움말:

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))튜플 목록을 반환합니다.

FOR로 할 수 있다는 건 알지만 다른 방법이 있는지 알고 싶어서

다른 방법이 있어요.지도와 아이템게터에서도 할 수 있습니다.

>>> 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.256996948방법 2: 1.466008011

목록을 반복해야 할 경우,for괜찮아요.

투 태플 리스트의 두 번째 요소를 끌어당기는 것이 가장 빠른 방법을 찾다가 이것을 발견했습니다.내가 원하는 것은 아니지만 세 번째 방법과 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

따라서 2개의 태플 쌍이 있는 경우 dict로 변환하여 값을 취하기만 하면 속도가 2배 이상 빨라집니다.

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()목록을 반환하지 않습니다.따라서 명시적인 변환이 이루어집니다.

map (lambda x:(x[1]),elements)

및 사용방법:

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

@daren의 답변은 마음에 들었지만 오류입니다.zip를 슬라이스할 수 없기 때문입니다.zip'아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.ziplist인덱스를 기반으로 원하는 요소를 추출합니다.

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

출력:

(1, 3, 5)

언급URL : https://stackoverflow.com/questions/3308102/how-to-extract-the-n-th-elements-from-a-list-of-tuples