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

Python 두 리스트에서 동일한 인덱스의 불일치 항목 찾는 방법

파이썬으로 작업하다 보면 두 개의 리스트를 단순히 값만 비교하는 것이 아니라, 값과 위치(인덱스)를 함께 비교해야 하는 경우가 있습니다. 예를 들어 데이터 검증이나 변경 사항 추적 시, 두 리스트에서 동일한 인덱스에 있지만 값이 서로 다른 요소를 찾아야 할 수 있습니다. 이 글에서는 그러한 불일치 항목의 인덱스를 찾는 세 가지 방법을 소개합니다.

1. for 루프 사용하기

가장 기본적인 방법은 for 루프를 사용해 동일한 인덱스의 값을 하나씩 비교하는 것입니다. 값이 일치하지 않으면 해당 인덱스를 결과 리스트에 추가합니다. 루프는 먼저 첫 번째 리스트의 요소를 가져오고, if 조건문으로 두 번째 리스트의 같은 위치 값과 비교합니다.

예제

listA = [13, 'Mon', 23, 62, 'Sun']
listB = [5, 'Mon', 23, 6, 'Sun']

# 인덱스 변수
idx = 0

# 결과 리스트
res = []

# 반복 처리
for i in listA:
    if i != listB[idx]:
        res.append(idx)
    idx += 1

# 결과 출력
print("값이 일치하지 않는 인덱스 위치:\n", res)

실행 결과

값이 일치하지 않는 인덱스 위치:
[0, 3]

2. zip 함수 사용하기

zip 함수를 활용하면 두 리스트의 요소를 인덱스별로 묶어 비교할 수 있어 훨씬 간결한 코드를 작성할 수 있습니다. 리스트 컴프리헨션과 함께 사용하면 값이 일치하지 않는 위치의 인덱스만 한 줄로 추출할 수 있습니다.

예제

listA = [13, 'Mon', 23, 62, 'Sun']
listB = [5, 'Mon', 23, 6, 'Sun']

res = [listB.index(n) for m, n in zip(listA, listB) if n != m]

# 결과 출력
print("값이 일치하지 않는 인덱스 위치:\n", res)

실행 결과

값이 일치하지 않는 인덱스 위치:
[0, 3]

3. enumerate 함수 사용하기

enumerate 함수를 사용하는 방법도 있습니다. 이 방식은 zip과 비슷하지만, 리스트 중 하나에 enumerate를 적용해 요소와 인덱스를 동시에 순회한다는 점이 다릅니다. 별도의 index() 호출 없이 인덱스를 직접 얻을 수 있어 더 직관적입니다.

예제

listA = [13, 'Mon', 23, 62, 'Sun']
listB = [5, 'Mon', 23, 6, 'Sun']

res = [idx for idx, elem in enumerate(listB)
       if elem != listA[idx]]

# 결과 출력
print("값이 일치하지 않는 인덱스 위치:\n", res)

실행 결과

값이 일치하지 않는 인덱스 위치:
[0, 3]

마무리

세 가지 방법 모두 동일한 결과를 반환하지만 상황에 따라 적합한 방법이 다릅니다. 초보자에게는 로직이 명확한 for 루프가, 간결함을 원한다면 zip이나 enumerate를 활용한 리스트 컴프리헨션이 좋습니다. 참고로 zip 방식에서 사용한 listB.index(n)는 리스트에 중복된 값이 있을 경우 첫 번째 위치만 반환하므로, 중복 값이 존재할 가능성이 있다면 enumerate 방식을 사용하는 것이 더 안전합니다.