Bayes 'Netsプログラムの "Variable Elimination"アルゴリズムを実装する過程で、一連のオブジェクトの反復的なマップ変換の結果として予期しないバグが発生しました。map対list;なぜ違う振る舞いですか?
簡単にするため、私はここで、コードの類似した部分を使用します:
>>> nums = [1, 2, 3]
>>> for x in [4, 5, 6]:
... # Uses n if x is odd, uses (n + 10) if x is even
... nums = map(
... lambda n: n if x % 2 else n + 10,
... nums)
...
>>> list(nums)
[31, 32, 33]
これは間違いなく間違った結果です。 [4,5,6]には2つの偶数が含まれているため、各要素には最大で2回、10
を追加する必要があります。 VEアルゴリズムでもこれが予期せぬ動作をしていたので、各繰り返しの後にイテレータをlist
に変換するように変更しました。
>>> nums = [1, 2, 3]
>>> for x in [4, 5, 6]:
... # Uses n if x is odd, uses (n + 10) if x is even
... nums = map(
... lambda n: n if x % 2 else n + 10,
... nums)
... nums = list(nums)
...
>>> list(nums)
[21, 22, 23]
イテレート可能オブジェクトの私の理解から、この変更は何も変わらないはずですが、それはありません。明らかに、not x % 2
ケースのn + 10
変換は、list
-edバージョンでは1回少ない回数だけ適用されます。
My Bayes Netsのプログラムもこのバグを見つけてもうまくいきましたが、なぜそれが発生したのかについての説明を探しています。
このようなコードは書かないでください。それは私の脳を傷つける。 – Kevin
あなたのコードはあなたが説明すべきことをしません。もしそれらが奇数であればその数を保持し、それらが偶数であれば10を足したければ、nums = map(x%2!= 0 else n + 10、numsならlambda n: if関数を評価するための何かが必要です。そうでなければ、常にtrueと評価されます。 BTW。あなたの編集が示唆するように、コードの問題は改行ではありませんでした。私はケビンが左に点と矢印であると不平を言っていると思います。 –
Python3では 'map'がイテレータなのでしょうか? – hpaulj