Pythonで怠zyなシーケンスを構築する方法はありますか?
-
28-10-2019 - |
質問
ロードするDjangoビューがあります Member
特定のフィルターを使用したデータベースからのオブジェクト。
今、私はこのロジックを変更する必要があります 特定を提示します Member
最初に、そして残りを自然な順序で追跡させます.
最も簡単な方法は、クエリをすぐに実行し、リストを取得し、最初にアイテムを削除して挿入することです。しかし、私は最も興味があります まだ使用する方法がある場合 QuerySet
怠zyな性質.
C#で、私は書くでしょう:
IEnumerable<Member> members = db.Members; // db.Members is lazy
members = Enumerable.Union( // construct a lazy sequence that traverses its arguments
new [] { specificMember },
members.Where(m => m != specificMember)
);
ループが通過するように members
, 、最初に得られます specificMember
そして、使用します 怠zyなロードロジックオリジナル db.Members
使用済み.
DjangoとPythonで同じことをする方法はありますか?
解決
使用する itertools.chain
. 。何かのようなもの:
import itertools
original_members = .... # get an iterator of the data
members = itertools.chain([specific_member], original_members)
チェーン関数はイテレーターを返します。 Iteratorは、最初のパラメーターのシーケンスから値を返すことから始めます。これは、特定の_memberを含むシングルエレメントリストです。次に、値の返品を開始します original_members
, 、これが怠zyなシーケンスだと思います。
所属していません StackOverflow