Python Language
groupby ()
수색…
소개
Python에서 itertools.groupby()
메서드를 사용하면 개발자는 지정된 속성을 기반으로 반복 가능한 클래스의 값을 반복 가능한 다른 값으로 그룹화 할 수 있습니다.
통사론
- itertools.groupby (iterable, key = None 또는 some function)
매개 변수
매개 변수 | 세부 |
---|---|
반복 가능한 | 모든 파이썬 반복 가능 |
키 | 반복 가능 여부를 그룹화 할 함수 (기준) |
비고
groupby ()는 까다 롭지 만이를 사용할 때 명심해야 할 일반적인 규칙은 다음과 같습니다.
그룹화 할 항목과 동일한 키를 사용하여 그룹화 할 항목을 항상 정렬하십시오.
독자가 여기서 문서를보고 클래스 정의를 사용하여 설명하는 방법을 확인하는 것이 좋습니다.
예제 1
문자열이 있다고 가정 해 보겠습니다.
s = 'AAAABBBCCDAABBB'
'A'가 하나의 목록에 있으므로 'B'와 'C'등으로 모두 분할하면됩니다. 이렇게 할 수 있습니다.
s = 'AAAABBBCCDAABBB'
s_dict = {}
for i in s:
if i not in s_dict.keys():
s_dict[i] = [i]
else:
s_dict[i].append(i)
s_dict
에 결과
{'A': ['A', 'A', 'A', 'A', 'A', 'A'],
'B': ['B', 'B', 'B', 'B', 'B', 'B'],
'C': ['C', 'C'],
'D': ['D']}
그러나 큰 데이터 세트의 경우 이러한 항목을 메모리에 구축하게됩니다. 이것은 groupby ()가 들어오는 곳입니다.
우리는 다음을 수행함으로써보다 효율적인 방식으로 동일한 결과를 얻을 수 있습니다.
# note that we get a {key : value} pair for iterating over the items just like in python dictionary
from itertools import groupby
s = 'AAAABBBCCDAABBB'
c = groupby(s)
dic = {}
for k, v in c:
dic[k] = list(v)
dic
에 결과
{'A': ['A', 'A'], 'B': ['B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}
group by를 사용할 때 'A'의 수는 원래 문자열의 'A'의 실제 수보다 적습니다. 아래에 나와있는 것처럼 항목을 c에 전달하기 전에 항목을 정렬하여 정보가 손실되는 것을 방지 할 수 있습니다.
c = groupby(sorted(s))
dic = {}
for k, v in c:
dic[k] = list(v)
dic
에 결과
{'A': ['A', 'A', 'A', 'A', 'A', 'A'], 'B': ['B', 'B', 'B', 'B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}
이제 우리는 모든 'A'를 가지고 있습니다.
예제 2
이 예는 우리가 아무것도 지정하지 않으면 기본 키가 선택되는 방법을 보여줍니다.
c = groupby(['goat', 'dog', 'cow', 1, 1, 2, 3, 11, 10, ('persons', 'man', 'woman')])
dic = {}
for k, v in c:
dic[k] = list(v)
dic
에 결과
{1: [1, 1],
2: [2],
3: [3],
('persons', 'man', 'woman'): [('persons', 'man', 'woman')],
'cow': ['cow'],
'dog': ['dog'],
10: [10],
11: [11],
'goat': ['goat']}
튜플 전체가이 목록에서 하나의 키로 간주됩니다.
예제 3
이 예에서 mulato와 camel은 우리의 결과에 나타나지 않습니다. 지정된 키가있는 마지막 요소 만 표시됩니다. c에 대한 마지막 결과는 실제로 두 개의 이전 결과를 지 웁니다. 그러나 새로운 버전의 데이터가 동일한 키에 먼저 정렬되어 있는지 살펴보십시오.
list_things = ['goat', 'dog', 'donkey', 'mulato', 'cow', 'cat', ('persons', 'man', 'woman'), \
'wombat', 'mongoose', 'malloo', 'camel']
c = groupby(list_things, key=lambda x: x[0])
dic = {}
for k, v in c:
dic[k] = list(v)
dic
에 결과
{'c': ['camel'],
'd': ['dog', 'donkey'],
'g': ['goat'],
'm': ['mongoose', 'malloo'],
'persons': [('persons', 'man', 'woman')],
'w': ['wombat']}
정렬 된 버전
list_things = ['goat', 'dog', 'donkey', 'mulato', 'cow', 'cat', ('persons', 'man', 'woman'), \
'wombat', 'mongoose', 'malloo', 'camel']
sorted_list = sorted(list_things, key = lambda x: x[0])
print(sorted_list)
print()
c = groupby(sorted_list, key=lambda x: x[0])
dic = {}
for k, v in c:
dic[k] = list(v)
dic
에 결과
['cow', 'cat', 'camel', 'dog', 'donkey', 'goat', 'mulato', 'mongoose', 'malloo', ('persons', 'man', 'woman'), 'wombat']
{'c': ['cow', 'cat', 'camel'],
'd': ['dog', 'donkey'],
'g': ['goat'],
'm': ['mulato', 'mongoose', 'malloo'],
'persons': [('persons', 'man', 'woman')],
'w': ['wombat']}
예제 4
이 예제에서 우리는 다른 유형의 iterable을 사용할 때 어떤 일이 발생 하는지를 봅니다.
things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "harley"), \
("vehicle", "speed boat"), ("vehicle", "school bus")]
dic = {}
f = lambda x: x[0]
for key, group in groupby(sorted(things, key=f), f):
dic[key] = list(group)
dic
에 결과
{'animal': [('animal', 'bear'), ('animal', 'duck')],
'plant': [('plant', 'cactus')],
'vehicle': [('vehicle', 'harley'),
('vehicle', 'speed boat'),
('vehicle', 'school bus')]}
아래의 예제는 본질적으로 위의 예제와 같습니다. 유일한 차이점은 모든 튜플을 목록으로 변경했다는 것입니다.
things = [["animal", "bear"], ["animal", "duck"], ["vehicle", "harley"], ["plant", "cactus"], \
["vehicle", "speed boat"], ["vehicle", "school bus"]]
dic = {}
f = lambda x: x[0]
for key, group in groupby(sorted(things, key=f), f):
dic[key] = list(group)
dic
결과
{'animal': [['animal', 'bear'], ['animal', 'duck']],
'plant': [['plant', 'cactus']],
'vehicle': [['vehicle', 'harley'],
['vehicle', 'speed boat'],
['vehicle', 'school bus']]}