在Python2中,一个常见的习惯用法是使用mapmap(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的这种特定行为...

推荐答案

这次我会回答我自己的问题.

使用Python 3x,您可以使用itertools.zip_longest,比如:

>>> list(map(lambda *a: a,*zip(*itertools.zip_longest(range(5),range(10,17)))))
[(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (None, 15), (None, 16)]

我想你也可以自己滚:

>>> def oldMapNone(*ells):
...     '''replace for map(None, ....), invalid in 3.0 :-( '''
...     lgst = max([len(e) for e in ells])
...     return list(zip(* [list(e) + [None] * (lgst - len(e)) for e in ells]))
... 
>>> oldMapNone(range(5),range(10,12),range(30,38))
[(0, 10, 30), (1, 11, 31), (2, None, 32), (3, None, 33), (4, None, 34), (None, None, 35), (None, None, 36), (None, None, 37)]

Python-3.x相关问答推荐

只有在Chrome尚未打开的情况下,打开Chrome后,PySimpleGUI窗口才会崩溃

如何有效地计算Kernel/Matrix

在多个测试中维护和报告变量

如何从选定的html内容中获取所需的文本

在Python代码中包含NAN值时,以两个矩阵计算RMSE

链接列未延伸到数据框的末尾

基于Pandas列动态创建分箱,以使观测值数量或计数占总计数的1%.

Python (pandas) - 判断一个 df 中的值是否在另一个(不相等)df 中的任何对之间

Pandas 窗口聚合两个排序表

双轴上的刻度和标签

python用户输入5个偶数并打印最大的

Seaborn:注释线性回归方程

创建一个可旋转的 3D 地球

为什么 Django South 1.0 使用 iteritems()?

如何遍历某些扩展名的文件?

从 IPython 重新加载 Python 扩展模块

如何替换 Python pathlib.Path 中的子字符串?

Python 3 中的连接列表

如何将文档字符串放在 Enums 上?

在 PyCharm 中配置解释器:请使用不同的 SDK 名称