gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:51:52 25 4
gpt4 key购买 nike

以下是我的代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com