Python itertools.groupby() 사용법
사용 방법:
- itertools 모듈 임포트:
import itertools
- groupby() 함수 호출:
groups = itertools.groupby(iterable, key=key_func)
iterable
: 그룹화할 대상이 되는 반복 가능한 객체 (리스트, 문자열, 튜플 등)key_func
: 각 요소의 키를 결정하는 함수 (선택 사항)
- 그룹 반복:
for key, group in groups:
# 각 그룹에 대한 처리
...
key
: 그룹의 키group
: 동일한 키를 가진 요소들의 이터레이터
예시:
# 리스트를 숫자의 홀짝 여부로 그룹화
numbers = [1, 2, 3, 4, 5]
def is_even(x):
return x % 2 == 0
groups = itertools.groupby(numbers, key=is_even)
for key, group in groups:
print(f"Key: {key}")
for num in group:
print(num)
# 출력:
# Key: False
# 1
# 3
# 5
# Key: True
# 2
# 4
추가 정보:
- key_func 함수는 선택 사항이며, 생략하면 각 요소 자체가 키로 사용됩니다.
- groupby() 함수는 원본 iterable을 소모합니다. 즉, 함수를 여러 번 호출하려면 iterable을 다시 만들어야 합니다.
- groupby() 함수는 여러 키를 기준으로 그룹화하는 데 사용할 수 있습니다. 이 경우 key_func 함수는 튜플과 같은 여러 값을 반환해야 합니다.
예제 코드
numbers = [1, 2, 3, 4, 5]
def is_even(x):
return x % 2 == 0
groups = itertools.groupby(numbers, key=is_even)
for key, group in groups:
print(f"키: {key}")
for num in group:
print(num)
# 출력:
# 키: False
# 1
# 3
# 5
# 키: True
# 2
# 4
문자열을 문자별로 그룹화
text = "Hello, world!"
groups = itertools.groupby(text)
for key, group in groups:
print(f"문자: {key}")
for char in group:
print(char)
# 출력:
# 문자: H
# H
# 문자: e
# e
# l
# l
# o
# o
# ,
# ,
#
# w
# o
# r
# l
# d
# !
#
튜플을 이름과 나이로 그룹화
people = [("Alice", 25), ("Bob", 30), ("Charlie", 25)]
def by_age(person):
return person[1]
groups = itertools.groupby(people, key=by_age)
for age, group in groups:
print(f"나이: {age}")
for name, age in group:
print(f"{name}, {age}")
# 출력:
# 나이: 25
# Alice, 25
# Charlie, 25
# 나이: 30
# Bob, 30
딕셔너리를 키-값 쌍으로 그룹화
data = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
groups = itertools.groupby(data.items(), key=lambda item: item[0])
for key, group in groups:
print(f"키: {key}")
for value in group:
print(value)
# 출력:
# 키: a
# ('a', 1)
# 키: b
# ('b', 2)
# 키: c
# ('c', 3)
# 키: d
# ('d', 4)
# 키: e
# ('e', 5)
itertools.groupby() 대체 방법
for 루프 사용:
def groupby(iterable, key_func):
groups = {}
for item in iterable:
key = key_func(item)
groups.setdefault(key, []).append(item)
return groups
# 예시
numbers = [1, 2, 3, 4, 5]
def is_even(x):
return x % 2 == 0
groups = groupby(numbers, key=is_even)
for key, group in groups.items():
print(f"키: {key}")
for num in group:
print(num)
# 출력:
# 키: False
# 1
# 3
# 5
# 키: True
# 2
# 4
collections.Counter 사용:
from collections import Counter
groups = Counter(iterable)
for key, count in groups.items():
print(f"키: {key}")
print(f"개수: {count}")
# 예시
numbers = [1, 2, 3, 4, 5, 2, 3]
groups = Counter(numbers)
for key, count in groups.items():
print(f"키: {key}")
print(f"개수: {count}")
# 출력:
# 키: 1
# 개수: 1
# 키: 2
# 개수: 2
# 키: 3
# 개수: 2
# 키: 4
# 개수: 1
# 키: 5
# 개수: 1
Pandas DataFrame 사용:
import pandas as pd
df = pd.DataFrame(iterable)
groups = df.groupby(key_func)
for key, group in groups:
print(f"키: {key}")
print(group)
# 예시
numbers = [1, 2, 3, 4, 5, 2, 3]
df = pd.DataFrame({"numbers": numbers})
groups = df.groupby("numbers")
for key, group in groups:
print(f"키: {key}")
print(group)
# 출력:
# 키: 1
# numbers
# 0 1
# 키: 2
# numbers
# 1 2
# 5 2
# 키: 3
# numbers
# 2 3
# 6 3
# 키: 4
# numbers
# 3 4
# 키: 5
# numbers
# 4 5
다른 라이브러리 사용:
itertools.groupby() 함수 외에도 다른 라이브러리에서 제공하는 그룹화 기능을 사용할 수 있습니다. 예를 들어, 다음과 같은 라이브러리가 있습니다.
선택 기준:
사용할 방법을 선택할 때는 다음과 같은 요소들을 고려해야 합니다.
- 데이터의 크기
- 그룹화 기준의 복잡성
- 원하는 결과 형식
- 성능
python python-itertools