0

whileループがあります:

while parent != None:
     pathList.append(parentMap[parent])
     parent = parentMap[parent]

このリストでやりたいのは、ツリーの最上部に到達して親がなくなるまで、親値の親値(コードの他の部分ですでに決定されている)をリストに追加することです。whileループは、parentMap [parent]に無効な[parent]キーが指定されると、「None」の値が割り当てられ、ループが終了するという考えの下で動作します。これは起こりません。代わりに、最上位のキー(5、5)に到達すると、プログラムは「無効なキー」というエラーをスローします。考え?

4

4 に答える 4

6

getキーがマップに見つからない場合は、このメソッドを使用してデフォルト値を返すことができます。

while parent is not None:
    pathList.append(parentMap[parent])
    parent = parentMap.get(parent, None) # returns None if key is not found
于 2012-10-12T21:24:32.720 に答える
4

他の人も指摘しているように、問題は、キーが見つからない場合はadictが返されないという事実にNoneありますが、代わりにKeyError例外が発生します(ドキュメントに示されているように)。

これを克服するには、defaultdictfromを使用して、そのdictのデフォルト値にcollections設定します。クラスNoneのドキュメントを読むことをお勧めします。

この場合、dictasを初期化する代わりに、parentMap = dict(some_initializer)またはparentMap = {}を使用できparentMap = defaultdict(lambda: None, some_initializer)parentMap = defaultdict(lambda: None, {})欠落しているキーは例外を発生させるNoneのではなく返されます。KeyError

無関係な問題でNoneは、はシングルトンです。item is not Noneを使用するよりも、かどうかを確認することをお勧めし!=ます。私の謙虚な意見では、それはより明確なコードを生成します。

于 2012-10-12T21:23:58.240 に答える
2
while parent != None:
      try:
           pathList.append(parentMap[parent])
           parent = parentMap[parent]
      except KeyError:
           parent = None

正常に動作するはずです

于 2012-10-12T21:22:51.737 に答える
1

エラーが表示される理由invalid keyは、おそらくparentMap[parent]最上位の親をに割り当てていないNoneためであり、マップに配置していないだけです。マップにないため、デフォルトの動作ではエラーがスローされinvalid keyます。

それはあなたがしていることですか?

編集:修正するには、parentMap.get(parent, None)

于 2012-10-12T21:13:03.233 に答える