리스트 안에서 연속으로 이어진 문자열 요소들을 하나의 그룹으로 묶어야 하는 경우가 있습니다. 이럴 때 itertools 모듈의 groupby 함수와 제너레이터의 yield 키워드를 활용하면 간단하게 해결할 수 있습니다.
예제 코드
아래 예제를 통해 실제 동작 방식을 확인해 보겠습니다.
from itertools import groupby
def string_check(elem):
return isinstance(elem, str)
def group_string(my_list):
for key, grp in groupby(my_list, key=string_check):
if key:
yield list(grp)
else:
yield from grp
my_list = [52, 11, 'py', 'th', 'on', 11, 52, 'i', 's', 18, 'f', 'un', 99]
print("The list is :")
print(my_list)
my_result = [*group_string(my_list)]
print("The result is:")
print(my_result)실행 결과
The list is : [52, 11, 'py', 'th', 'on', 11, 52, 'i', 's', 18, 'f', 'un', 99] The result is: [52, 11, ['py', 'th', 'on'], 11, 52, ['i', 's'], 18, ['f', 'un'], 99]
코드 설명
string_check 함수: 요소를 매개변수로 받아 해당 요소가 문자열(
str) 타입인지isinstance()로 판별합니다. 이 함수는groupby의 기준(key) 역할을 합니다.group_string 함수: 리스트를 매개변수로 받아
groupby로 연속된 요소들을 묶습니다. 그룹의 key가True, 즉 문자열인 경우에는 해당 그룹 전체를 리스트로 만들어yield로 반환하고, 문자열이 아닌 경우에는yield from을 사용해 개별 요소를 그대로 반환합니다.리스트 정의 및 출력: 함수 외부에서 숫자와 문자열이 섞여 있는 리스트를 정의한 뒤 콘솔에 출력합니다.
결과 확인:
group_string함수를 호출하고, 언패킹 연산자(*)를 활용해 제너레이터의 결과를 리스트로 변환하여 변수에 저장한 후 출력합니다.
핵심 포인트
groupby는 인접한 요소들만 그룹화한다는 점이 중요합니다. 따라서 위 예제에서처럼 같은 타입의 요소가 중간에 끊기면 별개의 그룹으로 나뉩니다. 실행 결과를 보면 연속된 문자열인 'py', 'th', 'on'은 하나의 리스트로 묶였지만, 떨어져 있는 'i', 's'와 'f', 'un'은 각각 다른 그룹으로 처리된 것을 확인할 수 있습니다.