gpt4 book ai didi

Python 3 与 Python 2 映射行为

转载 作者:IT老高 更新时间:2023-10-28 21:03:16 26 4
gpt4 key购买 nike

在 Python 2 中,一个常见的(旧的、遗留的)习惯用法是使用 mapmap(None,iter,iter,...) 形式加入长度不均匀的迭代器 像这样:

>>> map(None,xrange(5),xrange(10,12))
[(0, 10), (1, 11), (2, None), (3, None), (4, None)]

在 Python 2 中,它被扩展为 longest 迭代器是返回列表的长度,如果一个比另一个短,则用 None 填充。

在 Python 3 中,这是不同的。首先,您不能使用 None 作为位置 1 的可调用对象的参数:

>>> list(map(None, range(5),range(10,12)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

好的——我可以这样解决:

>>> def f(*x): return x    
...
>>> list(map(f, *(range(5),range(10,12))))
[(0, 10), (1, 11)]

但是现在,我有一个不同的问题:map 返回 shortest 迭代器的长度——不再用 None 填充。

当我将 Python 2 代码移植到 Python 3 时,这并不是一个可怕的罕见习语,而且我还没有找到一个简单的解决方案。

不幸的是,2to3 工具 does not选择这个——无用的建议:

-map(None,xrange(5),xrange(10,18))
+list(map(None,list(range(5)),list(range(10,18))))

建议?


编辑

有一些关于这个成语有多普遍的讨论。 See this SO post .

我正在更新我还在上高中时编写的遗留代码。 看看 2003 年的 Python 教程是 written and discussed Raymond Hettinger 指出了 map 的这种特定行为......

最佳答案

itertools.zip_longest做你想做的事,用一个更容易理解的名字。 :)

关于Python 3 与 Python 2 映射行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12015521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com