Im Zuge der Implementierung des "Variable Elimination" -Algorithmus für ein Bayes 'Nets-Programm stieß ich auf einen unerwarteten Fehler, der das Ergebnis einer iterativen Kartenumwandlung einer Sequenz von Objekten war.Karte vs Liste; Warum unterschiedliches Verhalten?
Der Einfachheit halber werde ich ein analoges Stück Code hier verwenden:
>>> 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]
Dies ist definitiv das falsche Ergebnis. Da [4, 5, 6] zwei gerade Zahlen enthält, sollte 10
jedem Element höchstens zweimal hinzugefügt werden. Ich bekam auch im VE-Algorithmus ein unerwartetes Verhalten, also modifizierte ich es, um den map
Iterator nach jeder Iteration in einen list
umzuwandeln.
>>> 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]
Von meinem Verständnis von Iterables, diese Modifikation sollte nicht ändern nichts, aber es tut. Klar, die n + 10
Transformation für den not x % 2
Fall wird in der list
-Version ein Mal weniger angewendet.
Mein Bayes Nets-Programm funktionierte auch nach dem Finden dieses Fehlers, aber ich suche nach einer Erklärung, warum es aufgetreten ist.
Bitte schreiben Sie keinen Code wie diesen. Es macht mein Gehirn weh. – Kevin
Ihr Code tut nicht das, was Sie erklären sollten. Wenn du möchtest, dass die Zahlen ungerade bleiben und wenn sie gerade sind, addiere zehn, dann musst du 'nums = map (lambda n: n wenn x% 2! = 0 else n + 10, nums)' setzen ... Es muss etwas für die if-Funktion ausgewertet werden, andernfalls wird es immer als wahr ausgewertet. Übrigens. Das Problem mit dem Code war keine Zeilenumbrüche, wie Ihre Änderungen andeuten. Ich denke, worüber Kevin sich beschwert, sind die Punkte und Pfeile auf der linken Seite. –
Könnte es sein, dass 'map' in Python3 ein Iterator ist? – hpaulj