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