Python 2 vs Python 3 - 具有三个参数的地图行为有何不同?
Python 2 vs Python 3 - Difference in map behavior with three arguments?
以下代码在 Python 2 和 Python 3 中的行为不同:
all(map(lambda x,y: x, [1, 2], [1, 2, 3]))
Python 2 给出 False
而 Python 3 给出 True
。 documentation for Python 2 says that it will supply None
if the shorter list is exhausted but Python 3 doesn't 这样做。
我正在编写一个代码,出于某种原因确实需要保持长度。获得旧行为的最干净的方法是什么?我知道我可以使用 from past.builtin import map as old_map
,但是是否有更优雅的解决方案可以在两个版本中使用?
本质上,map
具有多个可迭代的参数将 zip
可迭代,然后使用 zip
中的元组作为 var-args 调用函数。因此,您可以使用 itertools.starmap
和 zip
:
获得相同的行为
>>> a = [10, 20]
>>> b = [1, 2, 3]
>>> f = lambda x, y: x
>>> list(map(f, a, b))
[10, 20]
>>> from itertools import starmap
>>> list(starmap(f, zip(a, b)))
[10, 20]
那么你想要的行为可以通过将 zip
替换为 itertools.zip_longest
:
来实现
>>> from itertools import starmap, zip_longest
>>> list(starmap(f, zip_longest(a, b)))
[10, 20, None]
itertools
中的两个函数也存在于 Python 2 中,除了第二个函数被命名为 izip_longest
。您可以 import ... as ...
解决这个问题。
以下代码在 Python 2 和 Python 3 中的行为不同:
all(map(lambda x,y: x, [1, 2], [1, 2, 3]))
Python 2 给出 False
而 Python 3 给出 True
。 documentation for Python 2 says that it will supply None
if the shorter list is exhausted but Python 3 doesn't 这样做。
我正在编写一个代码,出于某种原因确实需要保持长度。获得旧行为的最干净的方法是什么?我知道我可以使用 from past.builtin import map as old_map
,但是是否有更优雅的解决方案可以在两个版本中使用?
本质上,map
具有多个可迭代的参数将 zip
可迭代,然后使用 zip
中的元组作为 var-args 调用函数。因此,您可以使用 itertools.starmap
和 zip
:
>>> a = [10, 20]
>>> b = [1, 2, 3]
>>> f = lambda x, y: x
>>> list(map(f, a, b))
[10, 20]
>>> from itertools import starmap
>>> list(starmap(f, zip(a, b)))
[10, 20]
那么你想要的行为可以通过将 zip
替换为 itertools.zip_longest
:
>>> from itertools import starmap, zip_longest
>>> list(starmap(f, zip_longest(a, b)))
[10, 20, None]
itertools
中的两个函数也存在于 Python 2 中,除了第二个函数被命名为 izip_longest
。您可以 import ... as ...
解决这个问题。