2012-03-08 11 views
6

Esto parece ser un patrón bastante común:manera Pythonic para incrementar y asignar los identificadores de diccionario

for row in reader: 
    c1=row[0] 
    if ids.has_key(c1): 
     id1=ids.get(c1) 
    else: 
     currid+=1 
     id1=currid 
     ids[c1]=currid 

quiero saber si hay una mejor manera de lograr esto. En cuanto a si las declaraciones sola línea van, lo que podía hacer esto:

id1=ids.get(c1) if ids.has_key(c1) else currid+1 

Pero entonces estoy atascado con el incremento Currid y ajustarse si se ha ejecutado el caso más y pegue c-> id1 en el diccionario si el si la condición pasó

Respuesta

5

Si los identificadores de empezar desde 0:

for row in reader: 
    id1 = ids.setdefault(row[0], len(ids)) 

(Además: has_key se considera obsoleto. Uso x in d en lugar de d.has_key(x))

+0

Eso es bastante lindo. – kindall

+0

¡Esto es perfecto! Lo aceptaré una vez que me lo permita. – Sid

+0

Gracioso; Publiqué [esta respuesta] (http://stackoverflow.com/a/9619677/166749) antes de hoy y en realidad [usado] (https://github.com/larsmans/scikit-learn/commit/86f621b1c738bd2b6d50a663b117500eae2fd63f#L1R79) esto idioma solo ayer. –

-1

Use este lugar:

pythonyc
id1 = ids.get(cl, currid + 1) 
0

un poco más, con la misma semántica:

for row in reader: 
    c1 = row[0] 
    if c1 not in ids: 
     currid += 1 
     ids[c1] = currid 
    id1 = ids[c1] 
1
currid += c1 not in ids 
id1 = ids.setdefault(c1, currid) 
+0

Esto no almacena la nueva identificación. –

+0

D'oh! Significa 'setdefault'. – kindall

4

Si no le importa cambiar la forma ids se define, entonces usted podría ir con esto (todos en la biblioteca estándar):.

ids = collections.defaultdict (itertools.count().next) 

El uso es muy simple continuación:

print (ids["lol"]) 
+0

agradable saber. Estoy construyendo una matriz de distancia, así que preferiría tener identificadores int. tener una gran cantidad de datos también. – Sid

+0

Muy bonito, pero esto también cambia el comportamiento del dict porque nunca volverá a generar un 'KeyError'. Aún así, +1. –

+0

@larsmans: no subir 'KeyError's es el punto de' defaultdict'. –

Cuestiones relacionadas