Python'un yerleşik itertoolsmodülünün aslında bir groupbyişlevi vardır, ancak bunun için gruplanacak öğelerin, gruplanacak öğeler listede bitişik olacak şekilde önce sıralanması gerekir:
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)
Şimdi giriş şöyle görünür:
[('5238761', 'ETH'), ('5349618', 'ETH'), ('962142', 'ETH'), ('7795297', 'ETH'),
('7341464', 'ETH'), ('5594916', 'ETH'), ('1550003', 'ETH'), ('11013331', 'KAT'),
('9843236', 'KAT'), ('9085267', 'NOT'), ('11788544', 'NOT')]
groupbyformun 2-demet dizisini döndürür (key, values_iterator). İstediğimiz, bunu 'tip'in anahtar olduğu ve' öğeler'in de values_iterator tarafından döndürülen tupleların 0. elemanlarının bir listesi olduğu bir dikt listesine dönüştürmek. Bunun gibi:
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)))
Şimdi result, sorunuzda belirtildiği gibi istediğiniz dikteyi içerir.
Yine de, bundan, türe göre ve değerler listesini içeren her değere göre anahtarlanmış tek bir dikte yapmayı düşünebilirsiniz. Mevcut formunuzda, belirli bir tür için değerleri bulmak için, eşleşen "tür" anahtarını içeren dikteyi bulmak için listeyi yinelemeniz ve ardından "öğeler" öğesini ondan almanız gerekir. 1 maddelik dikteler listesi yerine tek bir dikt kullanırsanız, belirli bir tür için öğeleri ana diktede tek bir anahtarlı aramayla bulabilirsiniz. Kullanıldığında groupby, bu şöyle görünür:
result = {}
for key,valuesiter in groupby(input, key=sortkeyfn):
result[key] = list(v[0] for v in valuesiter)
resultşimdi bu resdikteyi içerir (bu, @ KennyTM'nin cevabındaki ara varsayılan dikteye benzer ):
{'NOT': ['9085267', '11788544'],
'ETH': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'],
'KAT': ['11013331', '9843236']}
(Bunu tek satıra indirmek istiyorsanız, şunları yapabilirsiniz:
result = dict((key,list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn))
veya yeni çıkmış dikte-anlama formunu kullanarak:
result = {key:list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn)}
[('11013331', 'red', 'KAT'), ('9085267', 'blue' 'KAT')]tuple'ın son öğesi anahtar ve ilk ikisi değer olarak. Sonuç şöyle olmalıdır: sonuç = [{type: 'KAT', items: [('11013331', red), ('9085267', blue)]}]