0

ループするデータベースがあり、特定の条件に基づいて、関連するデータベースエントリを作成した辞書に送信します。次に、このディクショナリからランダムに1つを選択し、それをリストに格納し、ディクショナリをクリアして、増分変数を使用してすべてをやり直したいと思います。参考までに、['StartNoteNum']などはコストデータベース内の単なる列名です。

ただし、ループ全体で最初は正常に機能しますが、コード内の任意の場所(whileループの内側または外側)で辞書をクリアしようとすると、増分値に基づいて辞書が再入力されることはありません。すべきですが。正しく再入力されることを確認するために、初期値をwhileループで発生する可能性のあるすべての値に設定しました。各値はループ全体で最初に機能しますが、循環しようとすると失敗します。私が得るエラーは、ランダム関数が空の辞書からプルできないことです。Grr...ここにコードがあります。

def compute_policy(clean_midi, cost_database):
    note = 0             #Setting up starting variables.
    total_score = []
    current_finger = 1
    path = [1]
    next_move = {}
    while note <= 2:
        current_note = clean_midi[note]    #get note-pair for scoring
        dest_note = clean_midi[note+1]
        for each in cost_database:                            #find all relevant DB entries
            if (int(each['StartNoteNum']) == current_note
                and int(each['DestNoteNum']) == dest_note
                and int(each['StartFing']) == current_finger):
                next_move[int(each['DestFing'])] = int(each['Score'])  #move relevant entries to separate "bin"


        policy_choice = random.choice(next_move.keys())   #choose one at random
        total_score.append(next_move[policy_choice])       #track the scores for each choice in a list
        path.append(policy_choice)             #track the chosen finger
        current_finger = policy_choice        #update finger variable
        note += 1  
    path.append(current_finger)               #append last finger since the loop won't run again
    return total_score, path

ここでの助けをいただければ幸いです。ありがとう。

4

2 に答える 2

0

考えられる問題の1つは次のとおりです。

int(each['DestFing'])は常に同じである場合、ディクショナリ内の同じキーが更新され、カウントは1のままになります。

于 2013-02-02T05:21:48.800 に答える
0

cost_databaseイテレータを2回使用しようとしています。最初に通過した後は使い果たされ、2回目に使用しようとするとfor、空のイテレータが取得されたため、ループ全体がスキップされます。

>>> a = xrange(4)
>>> for i in a:
...    print(i)
0
1
2
3
4
>>> for i in a:
...    print(i)
>>> # Nothing since 'a' is already exhausted.
于 2013-02-02T10:13:13.460 に答える