2017-04-21 12 views
0

これは私のコードです。あなたの誰かがそれを見て何が間違っているのかが分かりましたか?反復中に辞書の長さが変化し続けるエラー。どのように私はこれを修正するのですか?基本的に何が起こっているのは、私はものをうまく追加することができ、彼らはうまく動作しますが、実際に飛ぶために行くとき(死ぬために)、辞書のサイズが変わってしまうので動かないと言います。助けてください私の辞書で何かを克服しようとしていると

import random 
from random import randint 

deathage = 30 
startingpop = 3 
rateofreproduction = 0 
howmanynewflies = 2 


def gennew(): 
    i = 0 
    list = [] 
    while i < 11: 
     i = i + 1 
     x = randint (1,4) 
     if x == 1: 
      list.append("A") 
     elif x == 2: 
      list.append("T") 
     elif x == 3: 
      list.append("C") 
     else: 
      list.append("G") 
    return list 

population = {} 

def createfly (x): 
    return ({"dna":x , "age":0}) 

for i in range(0,startingpop): 
    population[i] = (createfly(gennew())) 

print (population) 

def reproduce (x , y): 
    combos = [] 
    childfly = [] 
    for i in range (0,11): 
     combos.append((population[x]["dna"][i], population[y]["dna"][i])) 

    for i in range(0,len(combos)): 
     x = randint(0,1) 
     childfly.append(combos[i][x]) 
    return childfly 

#each gener**strong text**ation what happens 
while len(population) > 0: 
    for i in population: 
     population[i]["age"] = population[i]["age"] + 1 
     if population[i]["age"] > deathage: 
      population.pop(i) 
    flies = [] 
    for i in population: 
     flies.append(i) 
    for i in range(max(flies), (max(flies) + howmanynewflies)): 
     whichflyone = int(random.choice(list(population.keys()))) 
     whichflytwo = int(random.choice(list(population.keys()))) 
     population [i] = createfly(reproduce(whichflyone,whichflytwo)) 
    print() 
    print() 
    print(population) 

答えて

1

あなたのエラーが発生した箇所は以下の通りです。何が起きているのですか?​​を繰り返して、同時に要素を削除しようとしています。これを行うことはできません.10要素リストを反復した場合、最初の反復で10要素すべてが削除された場合、Pythonは存在しない要素をさらに9回反復しようとします。

#each gener**strong text**ation what happens 
while len(population) > 0: 
    removals = [] 
    for i in population: 
     population[i]["age"] = population[i]["age"] + 1 
     if population[i]["age"] > deathage: 
      removals.append(i) 
    for key in removals: 
     # population.pop(key) would also work. 
     del population[key] 
    flies = [] 
    for i in population: 
     flies.append(i) 
    for i in range(max(flies), (max(flies) + howmanynewflies)): 
     whichflyone = int(random.choice(list(population.keys()))) 
     whichflytwo = int(random.choice(list(population.keys()))) 
     population [i] = createfly(reproduce(whichflyone,whichflytwo)) 
    print() 
    print() 
    print(population) 

#each gener**strong text**ation what happens 
while len(population) > 0: 
    for i in population: 
     population[i]["age"] = population[i]["age"] + 1 
     if population[i]["age"] > deathage: 
      population.pop(i) # ERROR 
    flies = [] 
    for i in population: 
     flies.append(i) 
    for i in range(max(flies), (max(flies) + howmanynewflies)): 
     whichflyone = int(random.choice(list(population.keys()))) 
     whichflytwo = int(random.choice(list(population.keys()))) 
     population [i] = createfly(reproduce(whichflyone,whichflytwo)) 
    print() 
    print() 
    print(population) 

は、ループの外を取り除く(リストに追加することによって、例えば)あなたは除去のための要素をマークすることができ、代わりに( pop付き)の要素を除去する、この問題を解決するために、コードは実行されますが、停止するようには見えません。それがあなたの意図した動作であれば素晴らしいですが、それ以外の場合はさらにバグがあるかもしれません。 (たとえば、あなたの人口は0.30歳の30個のハエであり、あなたは常に次のサイクルで新しいものを追加するので、あなたのwhileループは決して壊れません)。 (あなたはグループの "名前" を格納していない限り)、

for i in range(0,startingpop): 
    population[i] = (createfly(gennew())) 

はほとんど*無意味です:

+0

ありがとうございました –

+0

私はそれがあなたの満足度に答えているならば、正しいと印を付けることを忘れないでください。これは他のユーザーが既に答えられた質問に答えるのを避けます。 – Darkstarone

1

ヒント:あなたの​​のような何かをやって、単に

def gennew(): 
    return random.sample('ATCG', 10) 

のほかのように書くことができあなたはできるでしょう

population = [createfly(gennew()) for i in range(startingpop)] 

あなたはリストを持ち歩くほうがはるかに簡単ですこの場合はdictとなります。

関連する問題