2012-08-17 82 views
0

我正在尝试将一些记录添加到字典中。无法更新python中的字典

起初,我是这样做这样

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]) 

这段代码没有例外地运行,但我最终只能得到许可证中的最后一个数据库记录,这让我感到困惑。

有什么建议吗?

回答

1

我觉得licenses是一个列表:

licenses = [] 
... 

,你应该追加到它的新字典:

licenses.append(dict(...)) 
0

如果您的文章中的代码是您的真实代码,那么您可以考虑在最后一行(带有更新的行)中用rec替换行,因为您有更新字典的机会总是相同的值!

编辑:在这段代码中显然存在一些非常错误的情况,从另一个答案我看到我忽略了许可证被声明为列表的事实:所以没有异常的唯一解释是您显示的代码段是不是真正的或者你所有的记录都是这样的,rec ['deleted']是True(所以更新方法永远不会被调用)。

1

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

  • 开始通过构建你需要(让你始终以相同的顺序访问它们)的密钥列表。

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

    licences = dict((k,[]) for k in keys] 
    
  • 递归条目添加到您的字典:

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

当然,这可能是更容易建立的名单先记录所有记录,然后在最后建立一个字典。

1

答曰dict.update()文档:

更新([其他])更新词典与来自其他 ,覆盖现有的密钥的密钥/值对。返回无。

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

0

后的反应,我已经修改了我的代码:

licenses = [] 

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

现在完美的作品。感谢您发现我的愚蠢! ;)