python - 如何在创建生成器时(而不是在迭代它时)评估 Python 生成器中的值?

标签 python django generator

以下是我的代码:

import itertools

i = itertools.chain()
for a in [1, 2, 3]:
    i = itertools.chain(i, (a for _ in range(2)))

print(list(i))
[3, 3, 3, 3, 3, 3]

有没有办法可以在创建生成器时访问 a 的值,而不是在 print 语句中迭代它时?

我希望输出为[1,1,2,2,3,3],即创建生成器时a的值.

这是一个微不足道的问题,但就我而言,我在外循环中迭代 1,000,000 行,然后在内循环中为这 100 万行中的每一行生成 8 行,所以我热衷于将其保留为生成器。

铌。用例是我在外循环中迭代一个表,为每一行创建子对象,将主键传递给子对象。数字非常大,所以我想构建生成器,然后在循环后批量插入(使用 Django 的 Model.objects.bulk_create(generator) )。但当我调用 bulk_create 时,主键始终设置为外循环中的最后一行。

gen = itertools.chain()
for id in ParentModel.objects.all().value_list('id', flat=True)):
    gen = itertools.chain(gen, (InnerModel(fk=id) for i in range(10000)))
InnerModel.objects.bulk_create(gen)

所有生成的 InnerModel 都指向列表中的最后一个 OuterModel。

最佳答案

一种方法是重构代码以使用两个 for genexp,以便 id 在需要时具有正确的值:

InnerModel.objects.bulk_create(
        InnerModel(fk=id) for id in ParentModel.objects.all().value_list('id', flat=True)
        for i in range(10000))

另一个好处是,您不会遇到使用这些嵌套所造成的令人讨厌的堆栈溢出。

关于python - 如何在创建生成器时(而不是在迭代它时)评估 Python 生成器中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38857108/

相关文章:

python - 在管理中预填充 django 水平过滤器

javascript - 在 Koa 发送响应后运行代码

python生成器垃圾收集

django - 重载 get_FIELD_display() 函数

python - 如何从数据帧在 keras flow 中提供一个热编码矢量数据帧

python - 实现前置附加参数的 functools.partial

Python 国际化,独立于本地设置

python - 我可以删除 django 中 url 中的前导零吗?

python - 如何实现单热编码的生成器函数

python - Django 装置 : Cannot assign data to textfield using json file