1

グループと個人の多対多の 2 つのモデルがあります。

group.individuals にアクセスして、関連する個人のリストを取得できます。最後に使用された個人を追跡するために、グループ モデルに「last_individual_id」列があります。この情報を使用して、グループの次の個人を取得する方法をさまよっていました。

個人のIDを取得してitertools.cycleを使用することを考えましたが、開始点を指定できません。さらに、SQLAlchemyで適切に実行できる場合、それは遅い方法かもしれません。

これを達成する方法について何か考えはありますか?答えが簡単すぎて恥ずかしくなりそうですが…今日はカフェイン抜きでした!

ありがとう

4

1 に答える 1

0

1 つの可能性は itertools.dropwhile を使用することです (ただし、明確ではないため、これは目的のソリューションの範囲として制限される場合があります。また、 itertools.dropwhile は itertools.cycle のようにリストを無限に循環しません)。

データモデルの詳細をあまり提供していません。group.individuals は個人オブジェクトのリストを返し、「.id」プロパティは各個人の ID 番号を表すと仮定します。たとえば、group.individuals のリスト内で個人 ID 7 を探しているとします。

from itertools import dropwhile
for item in dropwhile(lambda x: x.id != 7, group.individuals):
    print item

これは、id=7 が見つかるまで (または、より正確には、最初の False テストまで itertools.dropwhile が何も返さないため、x.id != 7 まで)、リストを調べてから、オブジェクトから個々のオブジェクトを返し始めます。リスト。したがって、そのリストの ID が [1, 19, 5, 6, 7, 2, 4, 5] の場合、7 2 4 5 が返されます。

あなたの目的のために、最初に返された応答を無視し、その後の応答を使用するように思えます。

もう 1 つの方法は、group.individuals の元のリストを繰り返し処理して、必要な ID のインデックスを見つけ、インデックスをインクリメントすることです。これにより、計算されたインデックスがリストを超えた場合に、インデックスを 0 から開始することもできます。例:

def nextrecord(recordlist, value):    
    for i in range(len(recordlist)):        
        if recordlist[i].id == value:
            newindex = i + 1
            break
    if newindex >= len(recordlist):
        newindex = 0    
    return recordlist[newindex]

print nextrecord(group.individuals, 7)

しかしもちろん、これはより離散的であり、反復可能ではありません。これにアプローチする方法はおそらく他にもたくさんあります (関数を反復可能にすることを含む) が、私はまだカフェインを飲んでいません!

于 2011-05-04T13:56:28.473 に答える