【问题标题】:Pythonic way to increment and assign ids from dictionary从字典中增加和分配 id 的 Pythonic 方法
【发布时间】:2012-03-08 21:41:55
【问题描述】:

这似乎是一个很常见的模式:

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 案例,我会坚持递增 currid 和坚持,如果 if 条件通过,则坚持 c->id1 到字典中。

【问题讨论】:

    标签: dictionary if-statement python


    【解决方案1】:

    如果 ids 从 0 开始:

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

    (旁白:has_key 被视为已弃用。使用 x in d 而不是 d.has_key(x)。)

    【讨论】:

    • 有趣;我今天早些时候发布了this answer,实际上昨天才发布了used这个成语。
    • 就像我说的,常见的模式;)
    【解决方案2】:

    如果您不介意更改 ids 的定义方式,那么您可以使用这个(全部在标准库中):

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

    那么使用就很简单了:

    print (ids["lol"])
    

    【讨论】:

    • 很高兴知道。我正在构建一个距离矩阵,所以宁愿有 int id。也有大量的数据。
    • 非常好,但这也改变了 dict 的行为,因为它永远不会再引发KeyError。不过,+1。
    • @larsmans: 不提高KeyErrors 是defaultdict 的重点。
    • @Sid:这将给出整数 id,从 0 开始,然后递增 1,如您的示例所示。但正如 larsmans 所说,这会使字典的行为有所不同,使用时必须注意这一点。
    • @doublep 在我的情况下,这也可以很好地工作,因为 id 的类型不是关键。谢谢。
    【解决方案3】:
    currid += c1 not in ids
    id1 = ids.setdefault(c1, currid)
    

    【讨论】:

    • 这不存储新的id。
    【解决方案4】:

    改用这个:

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

    【讨论】:

      【解决方案5】:

      更多pythonyc,语义相同:

      for row in reader:
          c1 = row[0]
          if c1 not in ids:
              currid += 1
              ids[c1] = currid
          id1 = ids[c1]
      

      【讨论】:

        猜你喜欢
        • 2019-05-03
        • 2018-01-28
        • 2023-03-11
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        相关资源
        最近更新 更多