代码之家  ›  专栏  ›  技术社区  ›  dodgrile

无法在Python中更新词典

  •  1
  • dodgrile  · 技术社区  · 14 年前

    我正试图把一些记录加到字典里。

    起初我是这样做的

    licenses = [dict(licenseid=row[0], client=row[1], macaddress=row[2], void=row[18]) for row in db]
    

    但后来我意识到我需要做一些处理来过滤数据库中的记录,所以我尝试将代码更改为:

    for rec in db:
        if rec['deleted'] == False:
           licenses.update(dict(licenseid=row[0], client=row[1], macaddress=row[2], void=row[18])
    

    该代码毫无例外地运行,但我最终只得到了许可证中的最后一条数据库记录,这让我很困惑。

    5 回复  |  直到 7 年前
        1
  •  1
  •   Michał Niklas    14 年前

    我认为 licenses 是一个列表:

    licenses = []
    ...
    

    并且您应该向其附加新的字典:

    licenses.append(dict(...))
    
        2
  •  1
  •   Pierre GM    14 年前

    如果我理解正确的话,你想在一本字典中添加多个记录,对吧?你为什么不制作一本字典列表呢?

    • 首先建立一个您需要的密钥列表(这样您就可以始终以相同的顺序访问它们)。

      keys = ["licenses", "client", "macaddress", "void"]
      
    • 构造一个空字典:

      licences = dict((k,[]) for k in keys]
      
    • 以递归方式将条目添加到词典中:

      for (k,item) in row:
          dict[k].append(item)
      

    当然,先建立一个所有记录的列表,然后在最后构建一个字典可能会更容易。

        3
  •  1
  •   msw    14 年前

    引用 dict.update() 文件:

    更新([其他]) 使用中的键/值对更新字典 其他,覆盖现有密钥。返回无。

    这就解释了上次更新“获胜”的原因。 licences 不能是列表,因为没有列表的更新方法。

        4
  •  0
  •   Thibauld Nion    14 年前

    如果你帖子中的代码是你真正的代码,那么你可能会考虑在最后一行(带更新的那一行)用rec替换行,因为你更新字典时有可能总是使用相同的值!

    编辑:很明显,这段代码中有一些非常错误的地方,从另一个答案来看,我忽略了许可证被声明为列表的事实:因此,没有例外的唯一解释是,要么你显示的片段不是真实的片段,要么你的所有记录都是真实的,因此rec[“deleted”]为True(因此永远不会调用更新方法)。

        5
  •  0
  •   dodgrile    14 年前

    回复后,我修改了我的代码:

    licenses = []
    
    for row in db:
            if row.deleted == False:
                licenses.append(dict(licenseid=row[0], client=row[1], macaddress=row[2], void=row[18]))
    

    现在效果很好。谢谢你发现我的愚蠢!;)