在Python2中,一个常见的习惯用法是使用map
以map(None,iter,iter,...)
的形式连接长度不均匀的迭代器,如下所示:
>>> map(None,xrange(5),xrange(10,12))
[(0, 10), (1, 11), (2, None), (3, None), (4, None)]
在Python2中,它被扩展为longest迭代器是返回列表的长度,如果一个比另一个短,则用None
填充.
在Python3中,这是不同的.首先,不能将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
填充.
当我将Python2代码移植到Python3时,这并不是一个非常罕见的习惯用法,而且我还没有找到一个简单的就地解决方案.
不幸的是,2to3 tools does not发现了这一点——毫无帮助地建议:
-map(None,xrange(5),xrange(10,18))
+list(map(None,list(range(5)),list(range(10,18))))
建议?
Edit
有人讨论过这个成语有多普遍.See this SO post
我正在更新由Raymond Hettinger编写的遗留代码when I was still in high school.查看2003 Python教程written and discussed,并指出map的这种特定行为...