2012-03-08 171 views
6

IDS Python的方式这似乎是一个很常见的模式:递增并分配从字典

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

我想知道是否有更好的方式来实现这一目标。至于单行if语句去,我可以这样做了:

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

但后来我坚持用递增currid,如果在执行别的情况下坚持,坚持C-> ID1到字典如果如果条件通过。

回答

5

如果ID从0开始:

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

(除此之外:has_key被视为弃用。使用01的代替d.has_key(x)

+0

这很可爱。 – kindall 2012-03-08 21:51:40

+0

这是完美!一旦它允许我接受,就会接受。 – Sid 2012-03-08 21:52:19

+0

有趣;我今天早些时候发布了[这个答案](http://stackoverflow.com/a/9619677/166749),实际上[used](https://github.com/larsmans/scikit-learn/commit/86f621b1c738bd2b6d50a663b117500eae2fd63f#L1R79)this成语只有昨天。 – 2012-03-08 21:54:20

-1

用这个代替:

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

有点pythonyc,用相同的语义:

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

这不会存储新的ID。 – 2012-03-08 21:52:18

+0

D'oh!意思是'setdefault'。 – kindall 2012-03-08 21:55:31

4

如果你不介意的变化如何ids定义,那么你可以用这个(都走在了标准库):

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

用法则很简单:

print (ids["lol"]) 
+0

很高兴知道。我正在建立一个距离矩阵,所以宁愿有int ID。也有大量的数据。 – Sid 2012-03-08 21:57:30

+0

非常好,但是这也改变了字典的行为,因为它永远不会再引发'KeyError'。仍然是+1。 – 2012-03-08 21:59:37

+0

@larsmans:不提高'KeyError'是'defaultdict'的要点。 – 2012-03-08 22:03:05