1

我正在尝试将一些记录添加到字典中。

最初我是这样做的

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

该代码毫无例外地运行,但我只得到许可证中的最后一个 db 记录,这让我感到困惑。

4

5 回答 5

1

我认为licenses是一个列表:

licenses = []
...

你应该追加新的字典:

licenses.append(dict(...))
于 2012-08-17T08:49:49.487 回答
1

如果我理解正确,您想在一个字典中添加多条记录,对吗?你为什么不制作一个字典列表,而不是制作一个列表字典呢?

  • 首先构建您需要的密钥列表(以便您始终以相同的顺序访问它们)。

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

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

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

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

于 2012-08-17T09:10:03.243 回答
1

引用dict.update()文档:

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

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

于 2012-08-17T09:17:27.163 回答
0

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

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

于 2012-08-17T08:47:20.890 回答
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]))

现在可以完美运行。谢谢你发现我的愚蠢!;)

于 2012-08-17T10:16:29.003 回答