背景: - 我正在尝试合并来自同一模型的2个查询集。 像这样的东西。即每三个柜台应该合并。
queryset = get_foo(person) #First queryset
promoted_foo = get_promoted_foo() #Second queryset
for (counter,(s,p)) in enumerate(itertools.izip(queryset,promoted_foo)):
if counter%3==0:
queryset.insert(counter,promoted_foo.pop())
if promoted_foo:
queryset.extend(promoted_foo)
最恐怖的方式是什么? 我知道我可以在quersets上使用list()然后合并它们。但这会占用大量内存。那么什么可以替代呢?
答案 0 :(得分:1)
您可以定义自己的生成器,懒惰地从查询集中加载项目。
我没有测试过这个,但是有点像:
def everythird():
queryset = get_foo(person) #First queryset
promoted_foo = get_promoted_foo() #Second queryset
for (counter,(s,p)) in enumerate(itertools.izip(queryset,promoted_foo)):
if counter%3==0 and promoted_foo:
yield promoted_foo
elif queryset:
yield queryset
答案 1 :(得分:1)
如果您不打算使用返回的值,则无需迭代queryset或promote_foo。您也不应该修改从循环中迭代的容器。
另一种方法是:
# For a range with step size 3, from 0 until the length of the shortest container.
for idx in xrange(0, min(len(queryset), len(promoted_foo), 3):
queryset.insert(idx, promoted_foo.pop())
if promoted_foo:
queryset.extend(promoted_foo)
PS。您在queryset上使用insert()意味着它已经是一个列表。