[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