1

コードの問題部分:

while counter < length:
    if something:
    else:
        for key,value in dictionary.items():
            if something:
            else:
    counter += 1

構造体は{ key:[ {key:value,key1:value1}, {key:value,key1:value1} ] } 、カウンター (リスト インデックス) の目的です。

そのため、Python (3.2.3) を独学しているときに書いたいくつかのスクリプトで、これに何度か気づきました。

検索を試みましたが、うまくいきませんでした (おそらく私の検索用語が間違っているのではないでしょうか?)。ドキュメントを確認したところ、問題のように思われるのは、while ステートメントについて、「while ステートメントは、繰り返し実行するために使用されます。式が真である限り」。For ステートメントの場合、「式リストは 1 回評価されます」と表示されます。

スクリプトを実行すると、カウンターが 1 増加したため、キー エラーが発生し続けます。しかし、 for ステートメントは、別の辞書であるリストからの新しい要素を反映するように更新されていません。まだ最初の要素を使用しています。

while ループの各反復により、For ステートメントが再評価されると想定しました。どうやら私はその点で間違っていました。

これでコードを書き直してこれを修正できますが、これに何度か遭遇したので知りたいのは、この方法で while ステートメントで For ループを使用する方法です。 - while ループの各反復で For ステートメントを評価します。

ありがとう!

更新: 以下に実際のコードを追加しました。私が何か間違ったことをしているだけだとしても、私は驚かないでしょう。デバッガーで値を監視していたところ、count が 0 から 1 に変わると、while ループの次の繰り返しで開始されました。そこから、For ループ「for key,value in item.items():」に到達するまで、すべてが正常に進み、items() の値はまったく変更されませんでした。更新された更新:それを理解しようとした後、v: の for アイテムが問題の原因であると確信しています。私がそれを理解できるかどうか見てみましょう!

修理済み!v: の For アイテムに問題があり、これは while ループの外側にあり、ループに移動することで解決されました。

def checkDifferences(newFile,oldFile):
    resultDiff = []
    for k,v in newFile.items():
        if newFile[k] != oldFile[k]:
            for item in v:
                count = 0
                lengthList = len(newFile[k])
                newKeys = newFile[k][count].keys()
                oldKeys = oldFile[k][count].keys()                
                while count < lengthList:
                    if newKeys == oldKeys:
                        for key,value in item.items():
                            newValue = newFile[k][count][key] 
                            oldValue = oldFile[k][count][key]
                            if newValue == oldValue:
                                pass
                            else:
                                resultDiff.append((k,count,key, oldValue,newValue))
                    else:
                        newValue = list(newFile[k][count].keys())
                        oldValue = list(oldFile[k][count].keys())
                        keyList = [key for key in newValue if key not in oldValue]
                        print(keyList)
                        for key,value in item.items():
                            if key in keyList:
                                oldValue = oldFile[k][count][oldKey]
                                resultDiff.append((k,count,key, None,newValue))
                            else:
                                oldValue = oldFile[k][count][key]
                            newValue = newFile[k][count][key]
                            if newValue == oldValue:
                                pass
                            else:
                                resultDiff.append((k,count,key, oldValue,newValue))
                            oldKey = key
                    count += 1
     return resultDiff
4

3 に答える 3

2

ステートメント内の式はfor、for ループが始まるたびに 1 回評価されます。for ループを while ループに入れたので、while ループのたびに for ステートメントに遭遇すると、式が評価されます。

コードに何か問題があります。実際のコード サンプルを投稿します。

于 2012-07-05T21:42:57.300 に答える
1

私の推測'dictでは、OP はプライマリ ディクショナリに含まれるをループしたいと考えており、以下は一般的な流れを意味しています。

list_of_dicts = dictionary['key']
for subdict in list_of_dicts:
    print subdict.items() # or whatever
于 2012-07-05T21:40:10.150 に答える
1

あなたの質問は私には少し曖昧に思えますが、構造の形式とサンプルコードに関するコメントに基づいて、次の行に沿って何かを処理すると、その内容を処理できます。

# for structure { key:[ {key:value,key1:value1}, {key:value,key1:value1}, ... ] }

for dict_list in structure.values():
    if something:
    else:
        for key,value in dict_list.items():
            if something:
            else:

for外側の辞書から辞書の別のリストが取得されるたびに、内側のループが評価されますstructure。私が使ったのは、あなたがのキーがstructure.values()何であるかに興味がないようだからです。structureの各キーは、上記のコードで使用されている変数structureである辞書のリストである値に関連付けられているようです。dict_list

Python では、リストや辞書などのコンテナーの内容を処理するためにカウンターまたはループ インデックスが必要になることはほとんどありませんfor

于 2012-07-06T00:15:33.523 に答える