수색…


소개

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']]}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow