以下是我的代码:
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/