2017-12-10 2 views
0

辞書のリストを入力しようとしています。アイデアはbestpar = {'V0': 0.01976, 'theta': 0.1330, 'omega': 0.6131, 'kappa': 0.3534, 'rho': -0.8073}ように構成されたいくつかの辞書から開始し、反復的に1からそれがリコールされるたびに10冊の新しい辞書を作成するには、この機能を使用してそれらを更新している:ステートメントがfalseのときにループが停止しない

def addneighbor(optgrid): 

    sample_bestpar = bestpar.copy() 

    neighbor = [] 

    for key in sample_bestpar.keys(): 

     neighbor.append({k : sample_bestpar[k] if k!=key else sample_bestpar[k] + delta[key] for k in sample_bestpar}) 
     neighbor.append({k : sample_bestpar[k] if k!=key else sample_bestpar[k] - delta[key] for k in sample_bestpar})     

    return neighbor 

リスト内のこれらの新しい辞書を入れている私は何をしたいですリストの長さが100になるまで停止します。当然のことながら、関数は最初に最初の辞書に適用され、次に追加された新しい辞書などに適用され、必要な長さに達する。それを行うためのコードは以下の通りです:この場合

optgrid = [bestpar] 

gp = [] 

gp.extend(optgrid) 

while (len(gp) < 100): 

    for element in optgrid: 

     newneighbor = addneighbor(element) 

     gp.extend(newneighbor) 

     for element in newneighbor: 

      newnewneighbor = addneighbor(element) 

      gp.extend(newnewneighbor) 

初期の辞書リストは一つだけ(bestpar)で作られたが、私はもっと初期の辞書がある可能性がある場合を考慮して、私のループを適合させることが望まれています。残念ながら、gpの最終的な長さが111になるため、whileループは機能しないように見えるので、コードは停止しません。私が間違っていることは何ですか?

答えて

1

optgridnewneighborを通過する毎に、gpの長さだけをテストしています。おそらく、このようなパスの中で長さは100未満で始まり、終わりまでに111に達する。 100に達するとすぐに停止したい場合は、gpに追加するたびに長さをテストする必要があります。

breakステートメントを使用してループを停止することができます。

+0

while文がfalseのときにforループを停止する方法はありますか? gp.extend()の前にwhile条件を入れるべきですか?私はしばらくの間、すべてのブロックを検討していたが – Alexbrini

+0

「すべてのブロックを下にする」とはどういう意味なのか分からない。 'while'ループのガード条件は、各繰り返しの開始時にのみチェックされます。 –

+0

これは、あまりにも多くの辞書を埋めるループの2番目のものなので、while文が偽になったときにforループを止めるべきです。これは私が意味していたものです。私はこの場合にブレークを挿入する方法を知らない – Alexbrini

関連する問題