0

背景:-我正在尝试合并来自同一模型的 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)

最Pythonic的方法是什么?我知道我可以在 quersets 上使用 list() 然后合并它们。但这会消耗大量内存。那么有什么可以替代呢?

4

2 回答 2

1

如果您不打算使用返回的值,则无需遍历 queryset 或promotion_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。您在查询集上使用 insert() 意味着它已经是一个列表。

于 2012-07-21T13:27:07.787 回答
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
于 2012-07-21T12:17:03.967 回答