파이썬의 내장 itertools
모듈은 실제로 groupby
함수를 가지고 있지만, 그룹화 할 요소는 먼저 그룹화 할 요소가 목록에서 연속되도록 정렬되어야합니다.
from operator import itemgetter
sortkeyfn = itemgetter(1)
input = [('11013331', 'KAT'), ('9085267', 'NOT'), ('5238761', 'ETH'),
('5349618', 'ETH'), ('11788544', 'NOT'), ('962142', 'ETH'), ('7795297', 'ETH'),
('7341464', 'ETH'), ('9843236', 'KAT'), ('5594916', 'ETH'), ('1550003', 'ETH')]
input.sort(key=sortkeyfn)
이제 입력은 다음과 같습니다.
[('5238761', 'ETH'), ('5349618', 'ETH'), ('962142', 'ETH'), ('7795297', 'ETH'),
('7341464', 'ETH'), ('5594916', 'ETH'), ('1550003', 'ETH'), ('11013331', 'KAT'),
('9843236', 'KAT'), ('9085267', 'NOT'), ('11788544', 'NOT')]
groupby
형식의 2- 튜플 시퀀스를 반환합니다 (key, values_iterator)
. 우리가 원하는 것은 이것을 'type'이 키이고 'items'가 values_iterator에 의해 반환 된 튜플의 0 번째 요소의 목록 인 딕셔너리 목록으로 바꾸는 것입니다. 이렇게 :
from itertools import groupby
result = []
for key,valuesiter in groupby(input, key=sortkeyfn):
result.append(dict(type=key, items=list(v[0] for v in valuesiter)))
이제 result
질문에 명시된대로 원하는 사전이 포함되어 있습니다.
그러나 유형별로 키가 지정된 단일 사전과 값 목록을 포함하는 각 값을 만드는 것을 고려할 수 있습니다. 현재 양식에서 특정 유형의 값을 찾으려면 목록을 반복하여 일치하는 '유형'키가 포함 된 사전을 찾은 다음 여기에서 '항목'요소를 가져와야합니다. 1- 항목 사전 목록 대신 단일 사전을 사용하는 경우 마스터 사전에 대한 단일 키 조회로 특정 유형의 항목을 찾을 수 있습니다. 를 사용하면 groupby
다음과 같습니다.
result = {}
for key,valuesiter in groupby(input, key=sortkeyfn):
result[key] = list(v[0] for v in valuesiter)
result
이제이 dict가 포함되어 있습니다 ( res
@KennyTM의 대답 의 중간 defaultdict 와 유사합니다 ).
{'NOT': ['9085267', '11788544'],
'ETH': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'],
'KAT': ['11013331', '9843236']}
(이를 한 줄로 줄이려면 다음을 수행 할 수 있습니다.
result = dict((key,list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn))
또는 새로운 dict-comprehension 형식을 사용합니다.
result = {key:list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn)}
[('11013331', 'red', 'KAT'), ('9085267', 'blue' 'KAT')]
튜플의 마지막 요소는 키이고 처음 두 요소는 값입니다. 결과는 다음과 같아야합니다. result = [{type : 'KAT', 항목 : [( '11013331', red), ( '9085267', blue)]}]