2012-03-08 12 views
6

To wydaje się być dość powszechne wzór:pythonowy sposób, aby zwiększyć i przypisać identyfikatory ze słownika

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

Chcę wiedzieć, czy istnieje lepszy sposób na osiągnięcie tego celu. Jeśli chodzi o pojedynczej linii if iść, mogę to zrobić dużo:

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

Ale potem utknąłem z zwiększając currid i trzymanie jeśli sprawa jeszcze został stracony i trzymanie C-> ID1 do słownika Jeśli jeśli stan minął.

Odpowiedz

5

Jeżeli identyfikatory rozpocząć od 0:

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

(Na stronie: has_key jest uważane za przestarzałe. Użyj x in d zamiast d.has_key(x))

+0

To całkiem urocze. – kindall

+0

To jest idealne! Przyjmę, gdy tylko to pozwoli. – Sid

+0

Śmieszne; Wysłałem [tę odpowiedź] (http://stackoverflow.com/a/9619677/166749) wcześniej dzisiaj i faktycznie [używane] (https://github.com/larsmans/scikit-learn/commit/86f621b1c738bd2b6d50a663b117500eae2fd63f#L1R79) to idiom tylko wczoraj. –

-1

stosowany zamiast:

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

Nieco bardziej pythonyc z tymi samymi semantyki:

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

To nie powoduje zapisania nowego identyfikatora. –

+0

D'oh! Zmienia się na 'setdefault'. – kindall

4

Jeśli nie przeszkadza zmienia sposób ids jest zdefiniowana, a następnie można przejść z tego (wszystko w standardowej biblioteki).

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

Wykorzystanie jest wtedy bardzo proste:

print (ids["lol"]) 
+0

miło wiedzieć. Buduję matrycę odległości, więc wolałabym mieć intidy. Mam też ogromną ilość danych. – Sid

+0

Bardzo ładnie, ale to także zmienia zachowanie dyktatora, ponieważ nigdy więcej nie podniesie "KeyError". Nadal +1. –

+0

@larsmans: nie podnoszenie 'KeyError's jest punktem' defaultdict'. –

Powiązane problemy