2012-03-08 27 views
6

Đây dường như là một mô hình khá phổ biến:cách Pythonic để tăng và gán id từ điển

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

Tôi muốn biết nếu có một cách tốt hơn để đạt được điều này. Theo như dòng duy nhất nếu phát biểu đi, tôi có thể làm điều này nhiều:

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

Nhưng sau đó tôi bị mắc kẹt với incrementing currid và gắn bó nếu trường hợp khác đã được thực hiện và gắn bó c-> id1 vào từ điển nếu nếu điều kiện được thông qua.

Trả lời

5

Nếu id bắt đầu từ 0:

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

(Bên cạnh: has_key được coi là không dùng nữa. Sử dụng x in d thay vì d.has_key(x))

+0

Đó là khá dễ thương. – kindall

+0

Đây là hoàn hảo! Sẽ chấp nhận một khi nó cho phép tôi. – Sid

+0

Vui nhộn; Tôi đã đăng [câu trả lời này] (http://stackoverflow.com/a/9619677/166749) sớm hơn hôm nay và thực sự [đã sử dụng] (https://github.com/larsmans/scikit-learn/commit/86f621b1c738bd2b6d50a663b117500eae2fd63f#L1R79) thành ngữ chỉ ngày hôm qua. –

-1

Sử dụng này để thay thế:

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

Một chút pythonyc, với cùng một ngữ nghĩa:

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

Điều này không lưu trữ id mới. –

+0

D'oh! Có nghĩa là 'setdefault'. – kindall

4

Nếu bạn không nhớ thay đổi cách ids được xác định, sau đó bạn có thể đi với điều này (tất cả trong thư viện chuẩn):.

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

Cách sử dụng thì rất đơn giản:

print (ids["lol"]) 
+0

Điều cần biết. Tôi đang xây dựng một ma trận khoảng cách để thay vì sẽ có id int. có rất nhiều dữ liệu. – Sid

+0

Rất đẹp, nhưng điều này cũng thay đổi hành vi của dict bởi vì nó sẽ không bao giờ một lần nữa nâng một 'KeyError'. Tuy nhiên, +1. –

+0

@larsmans: không tăng 'KeyError's là điểm của' defaultdict'. –

Các vấn đề liên quan