[python] Seznam retezcu

Petr Prikryl PrikrylP na skil.cz
Úterý Říjen 31 14:39:48 CET 2006


Martin Jedlička
>
> ... Mam napr. takovyto seznam:
> a = [['aa', 'bb'], ['aa', 'cc'], ['aa', 'dd'], ['bb', 'dd'], 
> ['bb', 'ff']]
> 
> a potreboval bych je spojit podle prniho retezce...vsechny seznamy, 
> ktery zacinaji na stejny retezec ('aa' nebo 'bb'), tak dat do 
> jednoho takto:
> a = [['aa', 'bb', 'cc', 'dd'], ['bb', 'dd', 'ff']]
> jak?

konkureční řešení (k Pavlovu), které nepředpokládá, 
že seznamy mají na vstupu vždy dva prvky:

===========================
a = [['aa', 'bb'], ['aa', 'cc'], ['aa', 'dd'], ['bb', 'dd'], ['bb', 'ff']]

tab = {}
poradi = []

for lst in a:
    assert len(lst) > 0
    if lst[0] not in tab:
        poradi.append(lst[0])
        tab[lst[0]] = [ lst[0] ]
    tab[lst[0]].extend(lst[1:])

print poradi

vysledek = []
for id in poradi:
    vysledek.append(tab[id])

print vysledek
===========================

Tohle řešení zachová pořadí, ve kterém se první prvky 
objeví na vstupu. Pokud to není nutné, dá se to zkrátit
takto:
===========================
a = [['aa', 'bb'], ['aa', 'cc'], ['aa', 'dd'], ['bb', 'dd'], ['bb', 'ff']]

tab = {}

for lst in a:
    assert len(lst) > 0
    tab.setdefault(lst[0], [ lst[0] ]).extend(lst[1:])

vysledek = list(tab.values())

print vysledek
===========================

pepr


Další informace o konferenci Python