0

背景:-同じモデルの2つのクエリセットをマージしようとしています。このようなもの。つまり、3つおきのカウンターをマージする必要があります。

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)

これを行うための最もPythonの方法は何ですか?quersetでlist()を使用して、それらをマージできることはわかっています。しかし、それは多くのメモリを消費します。では、これに代わるものは何でしょうか?

4

2 に答える 2

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 に答える
1

返される値を使用しない場合は、querysetまたはpromoted_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()を使用しているということは、それがすでにリストであることを意味します。

于 2012-07-21T13:27:07.787 に答える