Seite 1 von 1

frage um 2D liste zusammenzufassen

Verfasst: Dienstag 11. Juli 2006, 10:16
von keboo
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

Verfasst: Dienstag 11. Juli 2006, 12:37
von 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.