Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 인덱스 리스트로 다른 리스트의 요소 추출하기

두 개의 리스트가 있다고 가정해 보겠습니다. 두 번째 리스트의 요소는 숫자로 이루어져 있으며, 첫 번째 리스트의 요소를 가리키는 인덱스 위치로 사용됩니다. 즉, 두 번째 리스트의 값에 해당하는 첫 번째 리스트의 요소들을 추출하는 것이 목표입니다.

이러한 시나리오를 처리할 수 있는 대표적인 방법 세 가지를 살펴보겠습니다.

1. map 함수와 __getitem__ 매직 메서드 활용

Python의 매직 메서드인 __getitem__은 리스트의 항목에 접근할 때 사용됩니다. 이를 map 함수와 함께 사용하면, 두 번째 리스트의 각 요소를 인덱스로 삼아 첫 번째 리스트에서 해당 값을 한 번에 가져올 수 있습니다.

예제

listA = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
listB = [0, 1, 3]

print("Given list A:", listA)
print("Given list B:", listB)

res = list(map(listA.__getitem__, listB))

print("Result :", res)

실행 결과

Given list A: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
Given list B: [0, 1, 3]
Result : ['Mon', 'Tue', 'Thu']

2. operator 모듈의 itemgetter 활용

operator 모듈은 itemgetter 메서드를 제공하며, 이를 이용해서도 동일한 작업을 수행할 수 있습니다. 아래 예제에서는 두 번째 리스트를 언패킹(unpacking)하여 여러 인덱스로 전달하고, itemgetter 함수를 적용해 첫 번째 리스트에서 대응하는 요소들을 한꺼번에 가져옵니다.

예제

from operator import itemgetter

listA = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
listB = [0, 1, 3]

print("Given list A:", listA)
print("Given list B:", listB)

res = list(itemgetter(*listB)(listA))

print("Result :", res)

실행 결과

Given list A: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
Given list B: [0, 1, 3]
Result : ['Mon', 'Tue', 'Thu']

3. numpy 라이브러리 활용

numpy 라이브러리를 사용하면 더욱 간결하게 해결할 수 있습니다. 두 리스트를 입력으로 배열을 생성한 뒤, 팬시 인덱싱(fancy indexing)으로 원하는 요소를 선택하고, 그 결과를 다시 리스트로 변환하면 됩니다.

예제

import numpy as np

listA = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
listB = [0, 1, 3]

print("Given list A:", listA)
print("Given list B:", listB)

res = list(np.array(listA)[listB])

print("Result :", res)

실행 결과

Given list A: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
Given list B: [0, 1, 3]
Result : ['Mon', 'Tue', 'Thu']

정리

세 가지 방법 모두 동일한 결과를 반환하지만 상황에 따라 선택 기준이 달라집니다. 외부 의존성 없이 표준 라이브러리만으로 처리하려면 map + __getitem__ 또는 itemgetter가 적합하고, 이미 numpy를 사용 중이거나 대량의 데이터를 다룰 때는 numpy 팬시 인덱싱이 성능 면에서 유리합니다.