frage um 2D liste zusammenzufassen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

hallo!

wieder mal eine kleine frage von mir:

ich hab folgende liste:

Code: Alles auswählen

liste = [['elem 1','elem 2','elem 3'],
['elem 1','elem 2','elem 3','elem 4'],
['elem 1','elem 2','elem 3','elem 4','elem 5' ],
['elem a 1','elem a 2','elem a 3'],
['elem a 1','elem a 2','elem a 3','elem a 4']
]
Meine Liste ist länger, aber diese kurze reicht um die Frage zu stellen.
Wie kann ich die Liste zuammenfassen, dass nur die jeweils längsten Einträge von elem und elem a überbleiben:

Code: Alles auswählen


new_list =[ ['elem 1','elem 2','elem 3','elem 4','elem 5' ], 
['elem a 1','elem a 2','elem a 3','elem a 4']]
Danke,

Johannes
BlackJack

Code: Alles auswählen

from itertools import groupby
from pprint import pprint

data = [['elem 1','elem 2','elem 3'],
        ['elem 1','elem 2','elem 3','elem 4'],
        ['elem 1','elem 2','elem 3','elem 4','elem 5' ],
        ['elem a 1','elem a 2','elem a 3'],
        ['elem a 1','elem a 2','elem a 3','elem a 4']]

def keyfunc(item):
    return item[0].rsplit(' ', 1)[0]    # Get the element name.

data.sort(key=keyfunc)  # If not already sorted.
result = list()
for key, items in groupby(data, keyfunc):
    result.append(max((len(item), item) for item in items)[1])

pprint(result)
Das übliche `groupby()` und dann werden Tupel mit Listenlänge und zugehöriger Liste gebildet, daraus dann das Maximum ermittelt, also die längste bestimmt, und dann aus dem "grössten" Tupel die Liste als Ergebnis genommen.
Antworten