Pythonの組み込み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つの辞書を作成し、各値に値のリストを含めることを検討することもできます。現在のフォームで、特定のタイプの値を見つけるには、リストを繰り返し処理して、一致する 'type'キーを含むdictを見つけ、そこから 'items'要素を取得する必要があります。1項目のdictのリストの代わりに単一のdictを使用する場合、マスターdictへの単一のキー付き検索で特定のタイプの項目を見つけることができます。を使用すると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))
または、新しいfangled 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')]
の最後の要素はキーで、最初の2つは値です。結果は次のようになります。result= [{type: 'KAT'、items:[( '11013331'、red)、( '9085267'、blue)]}]