두 개의 리스트가 있다고 가정해 보겠습니다. 두 번째 리스트의 요소는 숫자로 이루어져 있으며, 첫 번째 리스트의 요소를 가리키는 인덱스 위치로 사용됩니다. 즉, 두 번째 리스트의 값에 해당하는 첫 번째 리스트의 요소들을 추출하는 것이 목표입니다.
이러한 시나리오를 처리할 수 있는 대표적인 방법 세 가지를 살펴보겠습니다.
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 팬시 인덱싱이 성능 면에서 유리합니다.