두 개의 리스트가 주어졌을 때, 첫 번째 리스트에서 두 번째 리스트의 요소와 값이 일치하는 항목들의 인덱스를 찾아야 하는 경우가 자주 있습니다. 예를 들어 요일 데이터가 담긴 리스트에서 특정 요일들이 몇 번째 위치에 있는지 확인하는 상황이 대표적입니다.
이번 글에서는 이러한 문제를 해결하는 두 가지 대표적인 방법을 소개합니다.
1. index() 메서드 활용하기
리스트에서 제공하는 index() 메서드를 사용하면 매우 간단하게 해결할 수 있습니다. 리스트 컴프리헨션(list comprehension)을 이용해 두 번째 리스트의 각 요소 값을 하나씩 가져오고, 그 값이 첫 번째 리스트에서 위치한 인덱스를 순서대로 추출하는 방식입니다.
예제 코드
listA = ['Mon','Tue', 'Wed', 'Thu', 'Fri']
listB = ['Tue', 'Fri']
# 주어진 리스트 출력
print("주어진 리스트:\n ",listA)
print("찾을 값 목록:\n ",listB)
# index() 메서드로 인덱스 추출
res = [listA.index(i) for i in listB]
# 결과 출력
print("일치하는 인덱스 목록 : ",res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
주어진 리스트: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'] 찾을 값 목록: ['Tue', 'Fri'] 일치하는 인덱스 목록 : [1, 4]
'Tue'는 첫 번째 리스트의 1번 인덱스에, 'Fri'는 4번 인덱스에 위치하므로 결과로 [1, 4]가 반환됩니다. 참고로 index() 메서드는 중복된 값이 있을 경우 가장 처음 등장하는 위치만 반환한다는 점을 유의해야 합니다.
2. enumerate()와 set() 조합하기
두 번째 방법은 enumerate() 함수를 활용하는 것입니다. enumerate()는 리스트를 순회하면서 각 요소의 인덱스(key)와 값(value)을 동시에 얻을 수 있게 해줍니다. 여기에 set()으로 변환한 두 번째 리스트와 값을 비교하여, 일치하는 경우 해당 인덱스를 추출합니다.
특히 두 번째 리스트를 set으로 변환하면 내부적으로 해시 기반 탐색이 이루어지므로, 리스트가 클 때 in 연산의 속도가 크게 향상된다는 장점이 있습니다.
예제 코드
listA = ['Mon','Tue', 'Wed', 'Thu', 'Fri']
listB = ['Tue', 'Fri']
# 주어진 리스트 출력
print("주어진 리스트:\n ",listA)
print("찾을 값 목록:\n ",listB)
# enumerate와 set을 활용한 인덱스 추출
res = [key for key, val in enumerate(listA)
if val in set(listB)]
# 결과 출력
print("일치하는 인덱스 목록 : ",res)실행 결과
위 코드를 실행하면 동일한 결과를 확인할 수 있습니다.
주어진 리스트: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'] 찾을 값 목록: ['Tue', 'Fri'] 일치하는 인덱스 목록 : [1, 4]
두 방법의 차이점 정리
index() 방식은 코드가 직관적이고 짧지만, 중복 값이 있을 때 첫 번째 위치만 반환됩니다. 반면 enumerate() 방식은 첫 번째 리스트를 한 번만 순회하면서 모든 일치 위치를 검사할 수 있어, 중복된 값의 인덱스까지 모두 찾아야 하는 상황에서 더 유연하게 확장할 수 있습니다. 데이터의 특성과 요구 사항에 맞는 방법을 선택하시면 됩니다.