0
a_string = 'abc'

destination = [2, 3]    

edges = { (1, 'a') : [2, 3],
          (2, 'a') : [2],
          (3, 'b') : [4, 3],
          (4, 'c') : [5] }

def make(a_string, destination, edges):
    n = 0
    while n + 1 < len(a_string):
        letter = a_string[n]
        letter2 = a_string[n + 1]
        for d in destination:                              # (1)
            if (d, letter2) in edges:
                for state in edges[(d, letter2)]:
                    destionation.append(state)
            destination.remove(d)
        n += 1                                             # (2)
    return destination

コードは戻ります[]が、表示されると思いますので、予期せず[5]インクリメントしてから変更することが問題だと思います。ループを完了する前に(位置1で)このコードが(位置2で)インクリメントするのはなぜですか?nletter2nfor

4

3 に答える 3

1

nは、ループが完了する前にインクリメントされません。おそらく欠落しているのは、whileループがnではなくn+1をチェックすることです。

今すぐ編集して、より多くの情報を入手します。

問題は、未定義の動作を持つイテレータからアイテムを削除していることです。

試す

for d in destination[:]:

これは配列全体のスライス演算子であるため、コピーコンストラクターとして機能します。これで別のオブジェクトをループしているので、削除は安全です。

于 2012-08-29T14:55:20.660 に答える
0

ループの最後でnに1を追加しない場合、ループ条件は同じままで、ループは永久に実行されます。forループではなく、whileループ本体で実行されます。(インデントは、行が属するコードのブロックを決定します!)

于 2012-08-29T14:50:10.253 に答える
0

文字列を反復処理することもでき、index文字列の方法を使用して、文字の次の位置を取得できます。

これら2つを組み合わせると、最初の外部ループを簡略化できます。

def make(a_string, destination, edges):

    for letter in a_string:
        while a_string.index(letter)+1 < len(a_string):
            next_letter = a_string[a_string.index(letter)+1]

stringさらに、変数はモジュールの名前であるため、名前を付けないでください。

于 2012-08-29T15:14:28.947 に答える