python:从列表循环

时间:2017-03-25 17:52:19

标签: python loops dictionary

我需要将数据从一个数据库导出到另一个数据库。数据对象需要映射到字典。

每行需要使用不同的值保存两次foobar = [' foo',' bar']。

foobar=['foo','bar']
data = []
for q in queryset:
    row = {"id": q.id,
           "created_at": q.created_at}
    for f in foobar:
        row['index'] = f
        data.append(row)
bulksave(data)

这并没有给出所需的结果:

 print data
 [{'id': 1, 'created_at': '2017-01-01', 'index': 'bar'},
  {'id': 2, 'created_at': '2017-01-02', 'index': 'bar'}]

期望的输出将具有' foo'和' bar'作为指数。 我如何让它工作? 采取不同的方法将循环不同:

for f in foobar:
    for q in queryset

这可行,但需要两倍的时间,因为查询集中的每个元素都将被评估两次。

1 个答案:

答案 0 :(得分:1)

问题在于内循环。您不断更新相同的dict并将其重新添加到datadata最终会对同一个dict进行多次引用,而dict已更新为foobar中的最后一个值。

只需在添加前复制。另外,关于写好问题的说明......如果可能的话,你想要一个可运行的例子。在这里,我模仿queryset,以便运行。

class Mock:
    def __init__(self, id, created_at):
        self.id = id
        self.created_at = created_at

queryset = [Mock(1, '2017-01-01'), Mock(2, '2017-01-02')]

foobar=['foo','bar']
data = []
for q in queryset:
    row = {"id": q.id,
           "created_at": q.created_at}
    for f in foobar:
        row['index'] = f
        data.append(row.copy())
bulksave(data)

<强>更新

如果您真的想让下一个人混淆查看您的代码,请将其全部折叠为

import itertools

class Mock:
    def __init__(self, id, created_at):
        self.id = id
        self.created_at = created_at

queryset = [Mock(1, '2017-01-01'), Mock(2, '2017-01-02')]

foobar=['foo','bar']

bulkupdate(list(dict(zip(('id', 'created_at', 'index'), (q.id, q.created_at, index)))
    for q, index in itertools.product(queryset, foobar)))

dgg32现已删除的帖子让我思考......)