개요
주어진 리스트 안에서 특정 하위 리스트(서브리스트)가 몇 번 등장하는지 확인해야 하는 경우가 종종 있습니다. 파이썬에서는 리스트 컴프리헨션(list comprehension)과 len 함수, 그리고 if 조건문을 조합하면 별도의 라이브러리 없이 간단하게 해결할 수 있습니다.
예제 코드
아래는 주어진 리스트에서 하위 리스트가 나타나는 횟수를 세는 방법입니다.
my_list = [23, 33, 45, 67, 54 , 43, 33, 45, 67, 83, 33, 45, 67,90, 0]
print("The list is : " )
print(my_list)
sub_list = [33, 45, 67, 90]
print("The sub-list is : " )
print(sub_list)
my_result = len([sub_list for index in range(len(my_list)) if my_list[index : index + len(sub_list)] == sub_list])
print("The resultant list is : ")
print(my_result)
실행 결과
The list is :
[23, 33, 45, 67, 54, 43, 33, 45, 67, 83, 33, 45, 67, 90, 0]
The sub-list is :
[33, 45, 67, 90]
The resultant list is :
1
코드 설명
정수로 구성된 리스트
my_list를 정의한 뒤 콘솔에 출력합니다.찾고자 하는 하위 리스트
sub_list를 정의하고 역시 콘솔에 출력합니다.리스트 컴프리헨션으로 전체 리스트를 순회하면서 각 인덱스마다
if조건을 검사합니다.조건식
my_list[index : index + len(sub_list)] == sub_list는 현재 인덱스부터 하위 리스트 길이만큼 잘라낸 부분이 하위 리스트와 완전히 일치하는지 확인합니다.일치하는 경우 그 항목이 임시 리스트에 추가되고, 마지막에
len()함수로 일치 횟수를 세어 결과 변수에 할당합니다.최종적으로 연속 패턴이 발견된 횟수인 1이 콘솔에 출력됩니다.
참고 사항
이 방법은 요소들이 연속으로 이어져 있는 경우만 카운트한다는 점에 유의하세요. 위 예제에서 [33, 45, 67] 조합은 두 번 등장하지만, 뒤에 90이 바로 이어지는 [33, 45, 67, 90] 패턴은 마지막 구간에서 단 한 번만 나타나므로 결과값이 1이 됩니다. 만약 리스트가 매우 크다면 슬라이싱 비교 대신 zip 기반의 슬라이딩 윈도우 방식을 사용하면 메모리를 더 효율적으로 아낄 수 있습니다.