2017-10-06 9 views
0

私は、データベース内の500件のレコードを持っていると私は辞書要素のPythonのリストにそれらのすべてをロードしています。(25キーと値のペア)トラバースPythonのリスト

私はすべての辞書の要素を横断メソッドを呼び出していますリストを作成し、各レコードに対して何らかのアクションを実行します。トラバース中に、私は要素の半分を横断した後、ロジックがメソッドを終了し、次の半分のために再び再起動することに気付きました。

例として入れようとしました。

例を(それが不可能であるように私は、正確なコードをコピーすることはできません):

def loadrec(): 
    reading from database and appending rows to a global list(mylist) 

def myrun(): 
    print "****** Execution Started **********" 
    for row in mylist: 
    doing some operations and printing a string 

if __name__=="__main__": 
i=0 
while (i>=0): #This never ends(to make the script run forever) 
    loadrec() 
    myrun() 
    print "****** Execution Ended ************" 



Result: 


****** Execution Started ********** 
printed 250 records 
****** Execution Ended ************ 


****** Execution Started ********** 
printed 125 records 
****** Execution Ended ************ 


****** Execution Started ********** 
printed 62 records 
****** Execution Ended ************ 

****** Execution Started ********** 
printed 31 records 
****** Execution Ended ************ 

****** Execution Started ********** 
printed 15 records 
****** Execution Ended ************ 

****** Execution Started ********** 
printed 7 records 
****** Execution Ended ************ 

****** Execution Started ********** 
printed 1 record 
****** Execution Ended ************ 

私はわからない、それは、全レコードの半分しかたびに処理している理由。 最後に、すべてのレコードを処理しています。

私はpythonリストの最大サイズまたはメモリに問題があるかどうかを確認しようとしましたが、どれも考えられるシナリオではありません。

理由が何であったかのヒントを知ってうれしいです。

+2

コードに問題がありますが、コードを表示することはできませんが、問題を特定することはできますか?困難になる。われわれが知っている限り、リストの途中でブレーク条件を明示的に記述しています。ありそうもないけど、どうすればわかるの? –

答えて

1

ここでは、暗いところで野生の刺し傷をとるつもりです。

あなたはこのような何かをやっている:

def myrun(): 
    print "****** Execution Started **********" 
    for row in mylist: 
     #Some processing here 
     myList.remove(row) 

はあなたが反復処理されているリストを変異することはできません。これは毎回リストの半分しか処理しないことを説明する。コードをリファクタリングする必要があります。私たちにあなたのコードを示していなければ、私はリファクタリングを試してやるつもりはありません。

+0

その野生の刺し傷をとってくれたAndrewに感謝します。それは私に正しく当たった。はい。それで合っています。私のメソッドでは、私はリストからiteratingしている項目を削除しています。あなたが言及したように、それはその半分の項目bcosだけを処理しています。さて、私は自分のコードをコメントしました、そして、それを半分にすることなく、今は完全な要素を横断しています。 –

+0

前述のように、私はいくつかのプライバシーの制限のためにコードを共有することはできません。とにかく、あなたは問題を特定することができます。ありがとうございました。私は、ロジックが削除されるたびに、Pythonが半分の要素しか処理しない理由を知りたいと思います。また、(ロジックごとに)リストから項目を削除する必要があるので、古いコードを保持すると問題が発生すると思いますか? (最後はまだすべての要素を処理していますが、毎回処理が半分ずつ行われています)。 –

+0

https://unspecified.wordpress.com/2009/02/12/thou-shalt-not-modify-a-list-during-iteration/これは私がここのスペースでできるほど良く説明します。リスト内の各項目を処理したいだけなら、 'while'ループを保持する必要はありません。確かに、ある時点でスクリプトを終了したいのですか? –

関連する問題