Das in Python integrierte itertools
Modul hat tatsächlich eine groupby
Funktion, aber dafür müssen die zu gruppierenden Elemente zuerst so sortiert werden, dass die zu gruppierenden Elemente in der Liste zusammenhängend sind:
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)
Jetzt sieht die Eingabe so aus:
[('5238761', 'ETH'), ('5349618', 'ETH'), ('962142', 'ETH'), ('7795297', 'ETH'),
('7341464', 'ETH'), ('5594916', 'ETH'), ('1550003', 'ETH'), ('11013331', 'KAT'),
('9843236', 'KAT'), ('9085267', 'NOT'), ('11788544', 'NOT')]
groupby
Gibt eine Folge von 2 Tupeln der Form zurück (key, values_iterator)
. Was wir wollen, ist, dies in eine Liste von Diktaten umzuwandeln, wobei der 'Typ' der Schlüssel ist und 'Elemente' eine Liste der 0-ten Elemente der Tupel ist, die vom values_iterator zurückgegeben werden. So was:
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
Enthält jetzt Ihr gewünschtes Diktat, wie in Ihrer Frage angegeben.
Sie könnten jedoch in Betracht ziehen, daraus nur ein einziges Diktat zu machen, das nach Typ und jedem Wert, der die Werteliste enthält, verschlüsselt ist. Um in Ihrem aktuellen Formular die Werte für einen bestimmten Typ zu ermitteln, müssen Sie die Liste durchlaufen, um das Diktat mit dem passenden Schlüssel "Typ" zu finden, und dann das Element "Elemente" daraus abrufen. Wenn Sie ein einzelnes Diktat anstelle einer Liste von 1-Element-Diktaten verwenden, können Sie die Elemente für einen bestimmten Typ mit einer einzigen verschlüsselten Suche im Master-Diktat finden. Mit groupby
würde dies folgendermaßen aussehen:
result = {}
for key,valuesiter in groupby(input, key=sortkeyfn):
result[key] = list(v[0] for v in valuesiter)
result
enthält jetzt dieses Diktat (dies ähnelt dem Zwischen- res
Standarddiktat in der Antwort von @ KennyTM):
{'NOT': ['9085267', '11788544'],
'ETH': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'],
'KAT': ['11013331', '9843236']}
(Wenn Sie dies auf einen Einzeiler reduzieren möchten, können Sie:
result = dict((key,list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn))
oder unter Verwendung der neuen Form des Diktverständnisses:
result = {key:list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn)}
[('11013331', 'red', 'KAT'), ('9085267', 'blue' 'KAT')]
folgt : wobei das letzte Element des Tupels der Schlüssel und die ersten beiden als Wert sind. Das Ergebnis sollte folgendermaßen aussehen: result = [{type: 'KAT', items: [('11013331', red), ('9085267', blue)]}]