튜플 리스트에서 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
'programing' 카테고리의 다른 글
| PowerShell에서 Windows 탐색기 창을 열 수 있습니까? (0) | 2023.04.29 |
|---|---|
| Bash 문자열 차이 (0) | 2023.04.24 |
| CS1617: /langversion 옵션 '6'이 잘못되었습니다.ISO-1, ISO-2, 3, 4, 5 또는 기본값이어야 합니다. (0) | 2023.04.24 |
| 최신 Azure SDK를 사용하여 Blob 상에서 공유 액세스시그니처를 취득하는 방법NET API v12? (0) | 2023.04.24 |
| SQL Server에 좌표(Google 지도의 경도/위도)를 저장하는 가장 좋은 방법은 무엇입니까? (0) | 2023.04.24 |