source

itertools.groupby()를 사용하는 방법

factcode 2022. 9. 13. 22:04
반응형

itertools.groupby()를 사용하는 방법

Python을 실제로 사용하는 방법에 대한 이해할 수 있는 설명을 찾을 수 없었습니다.itertools.groupby()기능.제가 하려는 일은 이것입니다.

  • 목록을 작성하십시오. 이 경우, 대상화된 개체의 자식lxml요소
  • 몇 가지 기준에 따라 그룹으로 나눕니다.
  • 그런 다음 각 그룹에 대해 개별적으로 반복합니다.

서류를 검토했지만, 단순한 숫자 목록 이상의 적용에 어려움을 겪고 있습니다.

그럼 어떻게 하면 좋을까요?itertools.groupby()다른 방법을 사용해야 합니까?좋은 "필수" 독서에 대한 조언도 감사할 것입니다.

중요사항: 먼저 데이터를 정렬해야 합니다.


제가 받지 못한 부분은 시공 예에서

groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
   groups.append(list(g))    # Store group iterator as a list
   uniquekeys.append(k)

k현재 그룹화 키입니다.g는 그룹 키로 정의된 그룹에 대해 반복하기 위해 사용할 수 있는 반복기입니다.즉,groupby반복자 자체는 반복자를 반환합니다.

다음은 더 명확한 변수 이름을 사용한 예입니다.

from itertools import groupby

things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]

for key, group in groupby(things, lambda x: x[0]):
    for thing in group:
        print("A %s is a %s." % (thing[1], key))
    print("")
    

그러면 다음과 같은 출력이 나타납니다.

곰은 동물이다.
오리는 동물이다.

선인장은 식물이다.

쾌속정은 자동차입니다.
스쿨버스는 차량이다.

이 예에서는,things는 각 태플의 첫 번째 항목이 두 번째 항목이 속한 그룹인 튜플 목록입니다.

groupby()함수는 (1) 그룹화할 데이터와 (2) 그룹화할 함수의 두 가지 인수를 사용합니다.

여기서,lambda x: x[0]말한다groupby()각 태플의 첫 번째 항목을 그룹 키로 사용합니다.

상기의 경우for진술,groupby는 각 고유 키에 대해1개씩 3쌍(키, 그룹 반복기)을 반환합니다.반환된 반복기를 사용하여 해당 그룹의 각 개별 항목에 대해 반복할 수 있습니다.

다음은 목록 이해를 사용한 동일한 데이터에 대한 약간 다른 예입니다.

for key, group in groupby(things, lambda x: x[0]):
    listOfThings = " and ".join([thing[1] for thing in group])
    print(key + "s:  " + listOfThings + ".")

그러면 다음과 같은 출력이 나타납니다.

동물: 곰과 오리.
식물: 선인장.
차량: 스피드 보트와 스쿨 버스.

itertools.groupby는 항목을 그룹화하는 도구입니다.

이 문서로부터, 우리는 그것이 무엇을 할 수 있는지를 한층 더 자세한 것은, 다음과 같습니다.

# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B

# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

groupby오브젝트는 그룹이 제너레이터인 경우 키와 그룹의 쌍을 생성합니다.

특징들

  • A. 연속된 항목을 함께 그룹화합니다.
  • B. 정렬된 반복 가능 항목에서 발생한 모든 항목을 그룹화합니다.
  • C. 키 기능을 사용하여 항목을 그룹화하는 방법을 지정합니다.

비교

# Define a printer for comparing outputs
>>> def print_groupby(iterable, keyfunc=None):
...    for k, g in it.groupby(iterable, keyfunc):
...        print("key: '{}'--> group: {}".format(k, list(g)))
# Feature A: group consecutive occurrences
>>> print_groupby("BCAACACAADBBB")
key: 'B'--> group: ['B']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A', 'A']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A', 'A']
key: 'D'--> group: ['D']
key: 'B'--> group: ['B', 'B', 'B']

# Feature B: group all occurrences
>>> print_groupby(sorted("BCAACACAADBBB"))
key: 'A'--> group: ['A', 'A', 'A', 'A', 'A']
key: 'B'--> group: ['B', 'B', 'B', 'B']
key: 'C'--> group: ['C', 'C', 'C']
key: 'D'--> group: ['D']

# Feature C: group by a key function
>>> # islower = lambda s: s.islower()                      # equivalent
>>> def islower(s):
...     """Return True if a string is lowercase, else False."""   
...     return s.islower()
>>> print_groupby(sorted("bCAaCacAADBbB"), keyfunc=islower)
key: 'False'--> group: ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D']
key: 'True'--> group: ['a', 'a', 'b', 'b', 'c']

사용하다

주의: 후자의 예 중 일부는 Vctor Terron의 PyCon(스페인어), "Kung Fu at Dawn with Itertools"에서 파생되었습니다.「」도 참조해 주세요.groupby C로 작성된 소스 코드.

* 모든 항목을 통과시켜 비교하는 기능으로 결과에 영향을 미칩니다.주요 기능을 가진 기타 개체는 다음과 같습니다.sorted(),max() ★★★★★★★★★★★★★★★★★」min().


대답

# OP: Yes, you can use `groupby`, e.g. 
[do_something(list(g)) for _, g in groupby(lxml_elements, criteria_func)]

Python 문서의 예는 매우 간단합니다.

groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

이 노드 , 즉 노드 목록입니다.keyfunc, 그 다음에 '기준 함수의 로직이 간다'가 됩니다.groupby()을 사용하다

문의하기 전에 기준에 따라 데이터를 정렬해야 합니다.groupby안 그러면 안 돼요 groupbymethod는 실제로 목록을 반복하고 키가 변경될 때마다 새 그룹을 생성합니다.

groupby에서는 길이 부호화를 1줄로 실행하는 방법이 있습니다.

[(c,len(list(cgen))) for c,cgen in groupby(some_string)]

에 2개의 튜플 목록이 표시됩니다.첫 번째 요소는 char이고 두 번째 요소는 반복 횟수입니다.

됩니다. 하세요.itertools.groupby서 the the 。GROUP BYsemantics:intertools는 미리 반복기를 정렬하지 않기 때문에(일반적으로 정렬할 수 없습니다), 같은 키를 가지는 그룹은 Marge 되지 않습니다.

또 다른 예는 다음과 같습니다.

for key, igroup in itertools.groupby(xrange(12), lambda x: x // 5):
    print key, list(igroup)

을 낳다

0 [0, 1, 2, 3, 4]
1 [5, 6, 7, 8, 9]
2 [10, 11]

:igroup는 반복기(설명서에 기재되어 있는 서브 반복기)입니다.

이는 제너레이터 청크에 유용합니다.

def chunker(items, chunk_size):
    '''Group items in chunks of chunk_size'''
    for _key, group in itertools.groupby(enumerate(items), lambda x: x[0] // chunk_size):
        yield (g[1] for g in group)

with open('file.txt') as fobj:
    for chunk in chunker(fobj):
        process(chunk)

다른 는 '보다'입니다.groupby되지 않은 - 키가 정렬되지 않은 경우. 예제에서는 에 있는 줍니다.xx에 있는 값별로 그룹화되어 있습니다.yy.첫 번째되고 이어서 이 출력되며 0 이 출력됩니다 이 경우 첫 번째 0 집합이 출력되고 이어서 1 집합이 출력되며 다시 0 집합이 출력됩니다.

xx = range(10)
yy = [0, 0, 0, 1, 1, 1, 0, 0, 0, 0]
for group in itertools.groupby(iter(xx), lambda x: yy[x]):
    print group[0], list(group[1])

작성:

0 [0, 1, 2]
1 [3, 4, 5]
0 [6, 7, 8, 9]

경고:

구문 목록(groupby(...))은 원하는 대로 작동하지 않습니다.내부 반복기 오브젝트를 파괴하는 것 같기 때문에

for x in list(groupby(range(10))):
    print(list(x[1]))

작성 내용:

[]
[]
[]
[]
[]
[]
[]
[]
[]
[9]

대신 list(groupby(...) 대신 groupby(...)의 k,g에 대해 [(k,list(g))]를 시도합니다.또, 그 구문을 자주 사용하는 경우는,

def groupbylist(*args, **kwargs):
    return [(k, list(g)) for k, g in groupby(*args, **kwargs)]

그룹별 기능에 액세스 할 수 있어 번거로운 (소량 데이터용) 반복을 회피할 수 있습니다.

다른 예로 분류 없는 groupby가 작동하지 않는 경우를 들 수 있습니다.James Sulak의 예에서 개작

from itertools import groupby

things = [("vehicle", "bear"), ("animal", "duck"), ("animal", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]

for key, group in groupby(things, lambda x: x[0]):
    for thing in group:
        print "A %s is a %s." % (thing[1], key)
    print " "

출력은

A bear is a vehicle.

A duck is a animal.
A cactus is a animal.

A speed boat is a vehicle.
A school bus is a vehicle.

차량을 가진 두 그룹이 있는 반면, 한 그룹은 한 그룹만 기대할 수 있었다

@CaptSolo, 당신의 예를 시험해 봤지만 소용없었다.

from itertools import groupby 
[(c,len(list(cs))) for c,cs in groupby('Pedro Manoel')]

출력:

[('P', 1), ('e', 1), ('d', 1), ('r', 1), ('o', 1), (' ', 1), ('M', 1), ('a', 1), ('n', 1), ('o', 1), ('e', 1), ('l', 1)]

보시다시피 두 개의 O와 두 개의 E가 있지만, 그들은 다른 그룹으로 나뉘었습니다.그때 그룹별 함수에 전달된 목록을 정렬해야 한다는 것을 깨달았습니다.따라서 올바른 사용법은 다음과 같습니다.

name = list('Pedro Manoel')
name.sort()
[(c,len(list(cs))) for c,cs in groupby(name)]

출력:

[(' ', 1), ('M', 1), ('P', 1), ('a', 1), ('d', 1), ('e', 2), ('l', 1), ('n', 1), ('o', 2), ('r', 1)]

참고로 리스트가 정렬되지 않으면 그룹화 기능이 작동하지 않습니다!

정렬 및 그룹화

from itertools import groupby

val = [{'name': 'satyajit', 'address': 'btm', 'pin': 560076}, 
       {'name': 'Mukul', 'address': 'Silk board', 'pin': 560078},
       {'name': 'Preetam', 'address': 'btm', 'pin': 560076}]


for pin, list_data in groupby(sorted(val, key=lambda k: k['pin']),lambda x: x['pin']):
...     print pin
...     for rec in list_data:
...             print rec
... 
o/p:

560076
{'name': 'satyajit', 'pin': 560076, 'address': 'btm'}
{'name': 'Preetam', 'pin': 560076, 'address': 'btm'}
560078
{'name': 'Mukul', 'pin': 560078, 'address': 'Silk board'}

Python의 itertools.groupby()를 사용하는 방법은 무엇입니까?

groupby를 사용하여 반복할 내용을 그룹화할 수 있습니다.그룹별로 반복 가능 및 반복 가능에서 항목을 확인할 수 있는 옵션 키 기능/호출 가능을 부여하면 키 호출 가능 결과와 실제 항목의 두 튜플을 다른 반복 가능 형식으로 제공하는 반복기가 반환됩니다.도움말:

groupby(iterable[, keyfunc]) -> create an iterator which returns
(key, sub-iterator) grouped by each value of key(value).

로 그룹화함으로써 키 coroutine은 coroutine을 사용합니다.coroutine.send를 뱉어내고 요소의 하면 다음과 같습니다

import itertools


def grouper(iterable, n):
    def coroutine(n):
        yield # queue up coroutine
        for i in itertools.count():
            for j in range(n):
                yield i
    groups = coroutine(n)
    next(groups) # queue up coroutine

    for c, objs in itertools.groupby(iterable, groups.send):
        yield c, list(objs)
    # or instead of materializing a list of objs, just:
    # return itertools.groupby(iterable, groups.send)

list(grouper(range(10), 3))

인쇄하다

[(0, [0, 1, 2]), (1, [3, 4, 5]), (2, [6, 7, 8]), (3, [9])]

이 기본적인 구현은 이 기능을 이해하는 데 도움이 되었습니다.다른 사람에게도 도움이 되길 바랍니다.

arr = [(1, "A"), (1, "B"), (1, "C"), (2, "D"), (2, "E"), (3, "F")]

for k,g in groupby(arr, lambda x: x[0]):
    print("--", k, "--")
    for tup in g:
        print(tup[1])  # tup[0] == k
-- 1 --
A
B
C
-- 2 --
D
E
-- 3 --
F

슬프게도, 이 제품을 사용하는 것은 권장되지 않습니다.itertools.groupby()안심하고 사용하기에는 너무 어렵고, 기대대로 동작하는 것을 쓰는 것은 몇 줄밖에 되지 않습니다.

def my_group_by(iterable, keyfunc):
    """Because itertools.groupby is tricky to use

    The stdlib method requires sorting in advance, and returns iterators not
    lists, and those iterators get consumed as you try to use them, throwing
    everything off if you try to look at something more than once.
    """
    ret = defaultdict(list)
    for k in iterable:
        ret[keyfunc(k)].append(k)
    return dict(ret)

다음과 같이 사용합니다.

def first_letter(x):
    return x[0]

my_group_by('four score and seven years ago'.split(), first_letter)

갖기 위해

{'f': ['four'], 's': ['score', 'seven'], 'a': ['and', 'ago'], 'y': ['years']}

우연히 알게 된 유용한 예가 하나 있습니다.

from itertools import groupby

#user input

myinput = input()

#creating empty list to store output

myoutput = []

for k,g in groupby(myinput):

    myoutput.append((len(list(g)),int(k)))

print(*myoutput)

입력 예: 14445221

출력 예: (1,1) (3,4) (1,5) (2,2) (1,1)

from random import randint
from itertools import groupby

 l = [randint(1, 3) for _ in range(20)]

 d = {}
 for k, g in groupby(l, lambda x: x):
     if not d.get(k, None):
         d[k] = list(g)
     else:
         d[k] = d[k] + list(g)

위의 코드는 groupby를 사용하여 제공된 람다 함수/키를 기반으로 목록을 그룹화하는 방법을 보여줍니다.유일한 문제는 출력이 Marge되지 않는다는 것입니다.이것은 사전을 사용해 간단하게 해결할 수 있습니다.

예제:

l = [2, 1, 2, 3, 1, 3, 2, 1, 3, 3, 1, 3, 2, 3, 1, 2, 1, 3, 2, 3]

그룹별 적용 후 결과는 다음과 같습니다.

for k, g in groupby(l, lambda x:x):
    print(k, list(g))

2 [2]
1 [1]
2 [2]
3 [3]
1 [1]
3 [3]
2 [2]
1 [1]
3 [3, 3]
1 [1]
3 [3]
2 [2]
3 [3]
1 [1]
2 [2]
1 [1]
3 [3]
2 [2]
3 [3]

위와 같이 사전을 사용하면 쉽게 반복할 수 있는 다음과 같은 결과가 도출됩니다.

{2: [2, 2, 2, 2, 2, 2], 1: [1, 1, 1, 1, 1, 1], 3: [3, 3, 3, 3, 3, 3, 3, 3]}

언급URL : https://stackoverflow.com/questions/773/how-do-i-use-itertools-groupby

반응형