Se si desidera una funzione generale per fare questo, si sta facendo quasi la domanda giusta. Il tuo esempio non specifica cosa succede quando la funzione chiave produce duplicati, comunque. Tieni l'ultimo? Il primo? Vuoi davvero fare un elenco di tutte le parole che iniziano con la stessa lettera? Queste domande probabilmente rispondono meglio all'utente della funzione, non dal progettista.
La parametrizzazione di questi risultati in una funzione più complessa, ma molto generale. Qui è uno che ho usato per diversi anni:
def reduce_list(key, update_value, default_value, l):
"""Reduce a list to a dict.
key :: list_item -> dict_key
update_value :: key * existing_value -> updated_value
default_value :: initial value passed to update_value
l :: The list
default_value comes before l. This is different from functools.reduce,
because functools.reduce's order is wrong.
"""
d = {}
for k in l:
j = key(k)
d[j] = update_value(k, d.get(j, default_value))
return d
Poi si può scrivere la funzione dicendo:
reduce_list(lambda s:s, lambda s,old:s[0], '', ['hello', 'world'])
# OR
reduce_list(lambda s:s, lambda s,old: old or s[0], '', ['hello', 'world'])
A seconda se si desidera mantenere la prima o l'ultima parola a cominciare, per esempio, 'h'.
Questa funzione è molto generale, però, così la maggior parte del tempo che è la base per altre funzioni, come la group_dict
o histogram
:
def group_dict(l):
return reduce_list(lambda x:x, lambda x,old: [x] + old, [], l)
def histogram(l):
return reduce_list(lambda x:x, lambda x,total: total + 1, 0, l)
Sto usando questo in un programma open source, sotto una licenza in stile BSD. Ti ho dato credito, voglio solo essere sicuro che tu stia bene con quello? –
Sono d'accordo, ma sono sorpreso che daresti un credito esplicito per un contributo così piccolo. –
@MarkByers, Nizza, grazie! – user1514631