[Python-es] encontrar una llave en un diccionario
Antoni Aloy
subscripcions en trespams.com
Sab Mayo 24 23:38:46 CEST 2008
El Dissabte, 24-05-08 a les 21:15 escrigueres:
> 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)
Un segundo, estamos tratando con datos que ya estan en un diccionario, no?
Entonces porqué no buscarlos directametente sin tener que mirar si existe
recuperando las claves.
d = {'a':1,'b',2}
if not d.get('c'):
d['c']='mi valor'
else:
....
No sé si he leido el mensaje en tranversal, pero si lo he entendido bien es la
opción más sencilla
--
Antoni Aloy López
Binissalem - Mallorca
http://trespams.com
Soci de bulma #34
Más información sobre la lista de distribución Python-es