본문 바로가기
Design/Python

[Python] itertools의 groupby()

by 공밀레의 재료 2021. 3. 12.
반응형

* 이 페이지는 개인적으로 공부하면서 이해가 힘들었던 일부 정보들을 정리 및 보관을 하기 위해 작성되었습니다.


 

itertools의 groupby는 문서에는 아래링크에 들어가면 세부 내용을 확인 가능하다.

(원문링크 : https://docs.python.org/2/library/itertools.html#itertools.groupby)

 

9.7. itertools — Functions creating iterators for efficient looping — Python 2.7.18 documentation

 

docs.python.org

사실 파이썬 초보인 필자에게 있어서 저 문서만 본다면 이해가 잘 되지 않는 것이 현실이다. 그래서 일부 내용을 이용해 맨땅에 헤딩을 하듯이 사용한 방법을 몇자 적어 놓을까 한다.

from itertools import groupby

s = input()
list_s = []

print(groupby(s))

 

위와 같이 코드를 작성하고 실행하면 아래와 같은 이터레이터(iterator)의 결과가 튀어나온다. next()를 이용해서 값을 볼 수 있겠지만, 귀찮아서 어디다 쓰겠는가.

처음 공부하다보면 map 등을 사용했을 때 쉽게 볼 수 있었던 구문인데 이 데이터를 보기 위해서는 보통 list를 취해주는 것이 좋다. 그래서 위 코드를 살짝 수정해 groupby(s)에 list를 취해주면 짠--! 하고 나올 줄 알았지만...

아래와 같은 이터레이터(iterator)의 형태로 구문을 결과로 받게 된다. (어림도 없지)

아까와는 다른 결과가 반환되는데, 볼 수 없었던 값들이 리스트로 변환되면서 무엇이 반환되었는지 확인이 가능해진다. 확실한건 list의 형태로 반환이 되었다는 것인데, 리스트 내부에 또다시 이터레이터가 발생했고, 이것을 보기 위해 링크에 있던 예제를 이용해서 코드를 변환시켜 보았다.

 

from itertools import groupby

s = input()
list_s = []

for k, g in groupby(s):
    print(k, list(g))

 

위의 결과를 실행하면, 아래의 사진과 같은 결과를 얻게 된다.

대충 눈치껏 보면 알겠지만, k에는 연속되는 문자가 무엇인지 배정이되고, g에는 반복되는 문자가 리스트의 형태로 저장되게 된다.

k -> 1 2 3 2

list(g) -> 1111 2 3 22

위와 같은 형태로 정리가 되는 것이다.

 

여기서부터는 응용이기에 따로 기술하지는 않지만 이를 이용하면 연속되는 구분을 잡아서 정리가 가능하다.

실제로, 이 부분에 대해서는 다른 사이트를 보면 오히려 자료를 key와 group으로 분류해서 정리해주는 유용한 기능으로 소개가 되고있다.

 

주의할 점은, groupby()는 연속된 것을 찾는 것이기 때문에 만약 뒤죽박죽 만들어진 정보가 있다면 sort를 해줘야지 제대로 작동할 수있다는 점이다.

반응형