Dictionary 从字典中递增和分配ID的Pythonic方法
这似乎是一种非常常见的模式:Dictionary 从字典中递增和分配ID的Pythonic方法,dictionary,if-statement,python,Dictionary,If Statement,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+
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
但是,如果执行了else case,我就必须增加currid,并在if条件通过时将c->id1粘贴到字典中。使用以下方法:
id1 = ids.get(cl, currid + 1)
有点pythonyc,语义相同:
for row in reader:
c1 = row[0]
if c1 not in ids:
currid += 1
ids[c1] = currid
id1 = ids[c1]
如果ID从0开始:
for row in reader:
id1 = ids.setdefault(row[0], len(ids))
(旁白:
has_key
被认为是不推荐使用的。使用d中的x
而不是d.has_key(x)
)如果您不介意更改ids
的定义方式,那么您可以使用此选项(全部在标准库中):
用法非常简单:
print (ids["lol"])
这不存储新id。有趣;我今天早些时候发布了这个成语,实际上是昨天才发布的很高兴知道。我正在构建一个距离矩阵,所以我宁愿使用int-id。也有大量的数据。非常好,但这也会改变dict的行为,因为它不会再次引发
keyrorm
。尽管如此,+1。@larsmans:not riskingKeyError
s是defaultdict
@Sid的要点:这将给出整数ID,从0开始,然后递增1,如您的示例所示。但正如拉斯曼所说,这将使字典的行为有所不同,如果你使用它,你必须意识到这一点。@doublep在我的情况下,这也会非常好地工作,因为ID的类型不是一个关键因素。谢谢
ids = collections.defaultdict (itertools.count ().next)
print (ids["lol"])