Si quieres una función general para hacer esto, entonces estás haciendo casi la pregunta correcta. Sin embargo, su ejemplo no especifica qué sucede cuando la función clave produce duplicados. ¿Conservas el último? ¿El primero? ¿Realmente desea hacer una lista de todas las palabras que comienzan con la misma letra? Es probable que el usuario de la función responda mejor estas preguntas, no el diseñador.
Parametrizar estos resultados en una función más complicada, pero muy general. Aquí hay uno que he utilizado desde hace varios años:
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
Entonces usted puede escribir su función diciendo:
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'])
Dependiendo de si se desea mantener la primera o la última palabra que empiece con, por ejemplo, 'h'.
Esta función es muy general, sin embargo, por lo que la mayor parte de las veces es la base para otras funciones, como 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)
Estoy usando esto en un programa de código abierto, bajo una licencia de estilo BSD. Te di crédito, ¿solo quieres asegurarte de que estás de acuerdo con eso? –
Estoy de acuerdo con eso, pero me sorprende que otorgue crédito explícito por una contribución tan pequeña. –
@MarkByers, Nice, gracias! – user1514631