텍스트 분석을 비롯한 다양한 데이터 분석 분야에서는 특정 리스트가 더 큰 리스트에 이미 포함되어 있는지 확인해야 하는 경우가 자주 발생합니다. 이 글에서는 파이썬으로 이러한 요구 사항을 구현하는 대표적인 세 가지 방법을 예제 코드와 함께 살펴봅니다.
1. all() 함수 활용하기
가장 직관적인 방법은 for 루프를 사용해 작은 리스트의 모든 요소가 큰 리스트에 존재하는지 하나씩 검사하는 것입니다. 이때 all() 함수를 함께 사용하면 모든 평가 결과가 참일 때만 True를 반환하므로, 부분 집합 여부를 간결하게 판별할 수 있습니다.
예제 코드
Alist = ['Mon', 'Tue', 5, 'Sat', 9]
Asub_list = ['Tue', 5, 9]
# 주어진 리스트와 부분 리스트 출력
print("주어진 리스트:", Alist)
print("부분 리스트:", Asub_list)
# all() 함수로 부분 집합 여부 확인
if (all(x in Alist for x in Asub_list)):
print("부분 리스트는 더 큰 리스트에 포함됩니다.")
else:
print("부분 리스트는 더 큰 리스트에 포함되지 않습니다.")
# 새로운 부분 리스트로 다시 확인
Asub_list = ['Wed', 5, 9]
print("새로운 부분 리스트:", Asub_list)
if (all(x in Alist for x in Asub_list)):
print("부분 리스트는 더 큰 리스트에 포함됩니다.")
else:
print("부분 리스트는 더 큰 리스트에 포함되지 않습니다.")실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
주어진 리스트: ['Mon', 'Tue', 5, 'Sat', 9] 부분 리스트: ['Tue', 5, 9] 부분 리스트는 더 큰 리스트에 포함됩니다. 새로운 부분 리스트: ['Wed', 5, 9] 부분 리스트는 더 큰 리스트에 포함되지 않습니다.
2. issubset() 메서드 활용하기
두 번째 방법은 리스트를 집합(set)으로 변환한 뒤, issubset() 메서드를 사용해 작은 리스트가 큰 리스트에 속하는지 검증하는 것입니다. 집합 연산을 활용하기 때문에 코드가 매우 간결해집니다.
예제 코드
Alist = ['Mon', 'Tue', 5, 'Sat', 9]
Asub_list = ['Tue', 5, 9]
# 주어진 리스트와 부분 리스트 출력
print("주어진 리스트:", Alist)
print("부분 리스트:", Asub_list)
# issubset()으로 부분 집합 여부 확인
if (set(Asub_list).issubset(set(Alist))):
print("부분 리스트는 더 큰 리스트에 포함됩니다.")
else:
print("부분 리스트는 더 큰 리스트에 포함되지 않습니다.")
# 새로운 부분 리스트로 다시 확인
Asub_list = ['Wed', 5, 9]
print("새로운 부분 리스트:", Asub_list)
if (set(Asub_list).issubset(set(Alist))):
print("부분 리스트는 더 큰 리스트에 포함됩니다.")
else:
print("부분 리스트는 더 큰 리스트에 포함되지 않습니다.")실행 결과
주어진 리스트: ['Mon', 'Tue', 5, 'Sat', 9] 부분 리스트: ['Tue', 5, 9] 부분 리스트는 더 큰 리스트에 포함됩니다. 새로운 부분 리스트: ['Wed', 5, 9] 부분 리스트는 더 큰 리스트에 포함되지 않습니다.
3. intersection() 메서드 활용하기
intersection() 함수는 두 집합 사이의 공통 요소(교집합)를 찾아줍니다. 이 방법에서는 두 리스트를 각각 집합으로 변환한 후 교집합을 구하고, 그 결과가 부분 리스트의 집합과 동일하다면 해당 부분 리스트가 원본 리스트에 포함되어 있다고 판단합니다.
예제 코드
Alist = ['Mon', 'Tue', 5, 'Sat', 9]
Asub_list = ['Tue', 5, 9]
# 주어진 리스트와 부분 리스트 출력
print("주어진 리스트:", Alist)
print("부분 리스트:", Asub_list)
# intersection()으로 부분 집합 여부 확인
if (set(Alist).intersection(Asub_list) == set(Asub_list)):
print("부분 리스트는 더 큰 리스트에 포함됩니다.")
else:
print("부분 리스트는 더 큰 리스트에 포함되지 않습니다.")
# 새로운 부분 리스트로 다시 확인
Asub_list = ['Wed', 5, 9]
print("새로운 부분 리스트:", Asub_list)
if (set(Alist).intersection(Asub_list) == set(Asub_list)):
print("부분 리스트는 더 큰 리스트에 포함됩니다.")
else:
print("부분 리스트는 더 큰 리스트에 포함되지 않습니다.")실행 결과
주어진 리스트: ['Mon', 'Tue', 5, 'Sat', 9] 부분 리스트: ['Tue', 5, 9] 부분 리스트는 더 큰 리스트에 포함됩니다. 새로운 부분 리스트: ['Wed', 5, 9] 부분 리스트는 더 큰 리스트에 포함되지 않습니다.
방법별 비교 및 참고 사항
세 가지 방법 모두 동일한 결과를 제공하지만, 상황에 따라 적합한 방법이 다릅니다.
- all() 방식: 추가 변환 없이 바로 사용할 수 있으며, 리스트 내 중복 요소나 순서 정보가 유지됩니다. 다만 리스트의 각 요소를 순회하며 검사하므로 데이터가 클 경우 O(n×m)의 시간이 걸릴 수 있습니다.
- issubset() / intersection() 방식: 집합 기반 해시 조회를 사용하기 때문에 일반적으로 더 빠르게 동작합니다. 다만 집합으로 변환하는 과정에서 중복 요소가 제거되고 순서 정보가 사라진다는 점에 유의해야 합니다.
또한 위 세 가지 방법은 모두 "요소의 포함 여부"를 확인하는 것이며, 리스트 안에서 연속된 구간으로 나타나는 부분 수열(subsequence) 여부를 확인하는 것과는 다릅니다. 연속 구간 여부가 필요하다면 슬라이싱이나 문자열 탐색 알고리즘을 활용해야 합니다.