Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 从字典中递增和分配ID的Pythonic方法_Dictionary_If Statement_Python - Fatal编程技术网

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 risking
KeyError
s是
defaultdict
@Sid的要点:这将给出整数ID,从0开始,然后递增1,如您的示例所示。但正如拉斯曼所说,这将使字典的行为有所不同,如果你使用它,你必须意识到这一点。@doublep在我的情况下,这也会非常好地工作,因为ID的类型不是一个关键因素。谢谢
ids = collections.defaultdict (itertools.count ().next)
print (ids["lol"])