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

파이썬에서 한 리스트가 다른 리스트에 포함되어 있는지 확인하는 방법


파이썬으로 개발을 하다 보면 서로 다른 두 개의 리스트가 주어졌을 때, 첫 번째 리스트가 두 번째 리스트 안에 포함되어 있는지(즉, 부분 리스트인지) 확인해야 하는 경우가 자주 발생합니다. 이 글에서는 이러한 문제를 해결하는 두 가지 대표적인 방법을 예제 코드와 함께 살펴봅니다.

방법 1: map과 join 함수 활용

첫 번째 방법은 map 함수와 join 함수를 조합하는 것입니다. 먼저 map 함수로 리스트의 모든 요소를 문자열로 변환한 뒤, join 함수를 사용해 각 요소를 쉼표로 구분된 하나의 문자열로 만듭니다. 이렇게 생성한 두 개의 문자열에 대해 in 연산자를 적용하면, 첫 번째 리스트가 두 번째 리스트에 포함되어 있는지 손쉽게 확인할 수 있습니다.

예제 코드

listA = ['x', 'y', 't']
listB = ['t', 'z', 'a', 'x', 'y', 't']
print("주어진 listA 요소: ")
print(', '.join(map(str, listA)))
print("주어진 listB 요소:")
print(', '.join(map(str, listB)))

res = ', '.join(map(str, listA)) in ', '.join(map(str, listB))
if res:
    print("List A는 List B에 포함됩니다")
else:
    print("List A는 List B에 포함되지 않습니다")

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

주어진 listA 요소:
x, y, t
주어진 listB 요소:
t, z, a, x, y, t
List A는 List B에 포함됩니다

방법 2: range와 len 함수 활용

두 번째 방법은 range 함수와 len 함수를 사용해 반복문을 구성하는 방식입니다. 먼저 len 함수로 첫 번째 리스트의 길이(n)를 구한 후, range 함수를 이용해 두 번째 리스트에서 가능한 모든 시작 위치를 순회합니다. 각 위치에서 슬라이싱(listB[i:i+n])으로 n개의 요소를 추출해 listA와 비교하며, any() 함수 덕분에 비교 결과 중 하나라도 일치하면 즉시 True를 반환합니다.

예제 코드

listA = ['x', 'y', 't']
listB = ['t', 'z', 'a', 'x', 'y', 't']
print("주어진 listA 요소: \n", listA)
print("주어진 listB 요소:\n", listB)

n = len(listA)
res = any(listA == listB[i:i + n] for i in range(len(listB) - n + 1))

if res:
    print("List A는 List B에 포함됩니다")
else:
    print("List A는 List B에 포함되지 않습니다")

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

주어진 listA 요소:
['x', 'y', 't']
주어진 listB 요소:
['t', 'z', 'a', 'x', 'y', 't']
List A는 List B에 포함됩니다

두 방법의 차이점과 주의 사항

map과 join 방식은 코드가 간결하다는 장점이 있지만, 리스트를 문자열로 변환한 뒤 부분 문자열 매칭을 수행하기 때문에 요소 값에 따라 의도치 않은 오탐(false positive)이 발생할 수 있습니다. 예를 들어 [1, 2]와 [11, 2]처럼 문자열로 결합했을 때 경계가 모호해지는 경우 잘못된 결과가 나올 수 있습니다.

range와 len 방식은 실제 요소를 하나씩 비교하는 슬라이싱 기반으로 동작하기 때문에 훨씬 정확하며, 리스트뿐 아니라 튜플 같은 다른 시퀀스 자료형에도 동일하게 적용할 수 있습니다. 따라서 정확성이 중요한 상황이라면 두 번째 방법을 사용하는 것이 좋습니다.