2017-07-11 7 views
0

私は入れ子になったforループを作成しようとしていましたが、何らかの理由で内部のループが1回しか起こらず、理由がわかりません。私はすでに起こっていただきました!ちょうど把握するために最低限に私のコードを削減しました:入れ子のforループの予期しない出力

pupil = db.session.query(Pupil).all() 
result = db.session.query(Pupil_OLD).all() 
for row in pupil: 
    for sublist in result: 
     print("sublist"+str(sublist.PUPIL_ID)) 
    print("pupil"+str(row.PUPIL_ID)) 

これが生成します。

pupil1 
sublist1 
sublist2 
sublist3 
pupil2 
pupil3 

それは誰もが持ってい

pupil1 
sublist1 
sublist2 
sublist3 
pupil2 
sublist1 
sublist2 
sublist3 
pupil3 
sublist1 
sublist2 
sublist3 

を作る必要がありますが私が間違ってやっているアイデア?

+0

'' 'db.session.query(Pupil_OLD).all()' ''は何を返しますか? – Anis

+1

私の推測では、 'for result in sublist for:'を実行することによってクエリを消費しているということです。 – fredtantini

+0

これはSQLAlchemyですか? 2行目の – Ryan

答えて

3

は、最後に到達しているジェネレータです。

あなたがそうのようにそれをリセットすることができます。それをリストに変換する

pupil = db.session.query(Pupil).all() 
for row in pupil: 
    result = db.session.query(Pupil_OLD).all() 
    for sublist in result: 
     print("sublist"+str(sublist.PUPIL_ID)) 
    print("pupil"+str(row.PUPIL_ID)) 

は別のオプションですが、あなたはクールな発電機を逃すだろう;)

発電のための私の愛はさておきだ、もしそれをリセットするということは、データベースに再照会することを意味します。リストを使う方がよいでしょう。

+0

各瞳孔に対して同じクエリを何度も繰り返し実行することはあまり効率的ではありません。 – Anis

+1

あなたの制約がスピードかメモリかによっておそらく決まりますが、クエリを繰り返すことは非効率です。 – Pedro

+0

メモリが問題の場合、結果は非常に大きく、ディスクメモリにダンプすると両方の問題が解決されます。 – Anis

1

あなたは、むしろそう発電機のように見えるdb.session.query(Pupil_OLD).all()の結果は、あなたの発電機があるように消費されることはありませんリストに変換され

pupil = db.session.query(Pupil).all() 
result = list(db.session.query(Pupil_OLD).all()) 

ような何かを行う必要があります。

関連する問題