2012-03-08 10 views
6

Questo sembra essere un modello abbastanza comune:modo Pythonic per incrementare e assegnare gli ID da dizionario

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

Voglio sapere se c'è un modo migliore per raggiungere questo obiettivo. Per quanto riguarda la singola linea if andare, avrei potuto fare questo:

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

Ma poi mi sono bloccato con l'incremento Currid e attaccare se è stato eseguito il caso altro e attaccare c-> id1 nel dizionario se il se la condizione è passata.

risposta

5

Se gli ID partono da 0:

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

(A parte: has_key è considerato deprecato. Utilizzare x in d invece di d.has_key(x))

+0

È carino. – kindall

+0

Questo è perfetto! Accetterà una volta che me lo permetterà. – Sid

+0

Divertente; Ho postato [questa risposta] (http://stackoverflow.com/a/9619677/166749) in precedenza oggi e in realtà [usato] (https://github.com/larsmans/scikit-learn/commit/86f621b1c738bd2b6d50a663b117500eae2fd63f#L1R79) questo idioma solo ieri. –

-1

Utilizzare questo invece:

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

Un po 'più pythonyc, con la stessa semantica:

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

Questo non memorizza il nuovo ID. –

+0

D'oh! Indicato per 'setdefault'. – kindall

4

Se non ti dispiace cambiare il modo ids è definito, allora si potrebbe andare con questo (tutti nella libreria standard):.

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

L'uso è quindi molto semplice:

print (ids["lol"]) 
+0

bello sapere. Sto costruendo una matrice di distanze quindi preferisco avere int ids. avere un enorme amt di dati. – Sid

+0

Molto bello, ma questo cambia anche il comportamento del dict perché non rileverà mai più un 'KeyError'. Ancora, +1. –

+0

@larsmans: non sollevare 'KeyError's è il punto di' defaultdict'. –

Problemi correlati