encontrar una llave en un diccionario

Arnau Sanchez pyarnau en gmail.com
Sab Mayo 24 21:15:16 CEST 2008


Otto Machado escribió:

> diccdetails = {}
> .......
> if date in diccdetails.keys():
>                         diccdetails[date]['Costo'] += float(tmp[9])
>                         diccdetails[date]['Trafico'] += float(tmp[8])
>                         diccdetails[date]['Peticiones'] = diccdetails[date]['Peticiones'] + 1
>                     else:
>                         diccdetails[date] = {}
>                         diccdetails[date]['Costo'] = float(tmp[9])
>                         diccdetails[date]['Trafico'] = float(tmp[8])
>                         diccdetails[date]['Peticiones'] = 1
>
> quiero saber si conocen alguna forma que sea mas eficiente, porque esta condición se cuestiona para cada línea de un fichero, y se vuelve un poco lenta.Hay alguna forma de verificar si esta o no esa llave que no sea asi?

Deberías hacer:

"if date in diccdetails:"

En tu código estás buscando innecesariamente un elemento en la lista de
claves (O(n)) y pierdes toda la eficiencia te da la operación directa
sobre el diccionario (O(1)). Ver: http://jaynes.colorado.edu/PythonIdioms.html

Si le damos alguna vuelta más al código podría quedar más legible:

    if date not in details:
        details[date] = dict(costo=0.0, trafico=0.0, peticiones=0)
    trafico, costo = map(float, (tmp[8], tmp[9]))
    details[date]["costo"] += costo
    details[date]["trafico"] += trafico
    details[date]["peticiones"] += 1

pd: Y si uno se empeña, podría escribir una versión más DRY (pero menos
pythonica):

    data_details = details.setdefault(date, {})
    trafico, costo = map(float, (tmp[8], tmp[9]))
    def update_details(field, value, init_value):
        date_details[field] = date_details.get(field, init_value) + value
    update_details("costo", costo, 0.0)
    update_details("trafico", trafico, 0.0)
    update_details("peticiones, 1, 0)


------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es