当前位置: 首页 > 面试题库 >

Python 3与Python 2地图行为

夹谷斌蔚
2023-03-14
问题内容

在Python 2中,一个常见的(旧的,遗留的)习惯用法是map使用如下形式来连接长度不均匀的迭代器map(None,iter,iter,...)

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

在Python 2中,它进行了扩展,以便 最长的 迭代器为返回列表的长度,如果一个比另一个短,则用填充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返回 最短的 迭代器长度-不再用填充None

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

不幸的是,2to3工具无法解决问题-无益地建议:

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

有什么建议吗?

编辑

我正在更新 还在上高中时 编写的旧代码 看一下Raymond
Hettinger编写和讨论的2003
Python教程,并指出地图的这种特定行为…


问题答案:

这次我将回答我自己的问题。

使用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)]


 类似资料:
  • 本文向大家介绍python2 与python3的print区别小结,包括了python2 与python3的print区别小结的使用技巧和注意事项,需要的朋友参考一下 在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异 主要体现在以下几个方面: 1.python3中print是一个内置函数,有多个参数,而python2中print是一个语法结构

  • 本文向大家介绍Python3和Python2的区别?相关面试题,主要包含被问及Python3和Python2的区别?时的应答技巧和注意事项,需要的朋友参考一下  

  • 本文向大家介绍Python3和Python2中int和long区别相关面试题,主要包含被问及Python3和Python2中int和long区别时的应答技巧和注意事项,需要的朋友参考一下 在python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。  

  • 本文向大家介绍Python2和Python3中@abstractmethod使用方法,包括了Python2和Python3中@abstractmethod使用方法的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python2和Python3中@abstractmethod使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 抽象方法

  • 问题内容: 我有一个在Python 2虚拟环境中运行的Flask应用程序。 我希望运行Python 3程序,因此需要将python3安装到虚拟环境中。我该怎么做呢?我必须重新创建环境吗?这是困难的迁移吗? 问题答案: 不建议混合使用多个版本的Python。实际上,我什至认为这是不可能的。 创建一个新的virtualenv一点都不困难: 获取当前virtualenv中的模块列表 pip freeze

  • 本文向大家介绍Windows下Python2与Python3两个版本共存的方法详解,包括了Windows下Python2与Python3两个版本共存的方法详解的使用技巧和注意事项,需要的朋友参考一下 前言 一向用Python 3,最近研究微信公众号开发,各云平台只支持Python 2.7,想用其他版本需要自己搭建环境。而网上又搜不到Python 3开发微信公众号的资料。暂打算先使用Python 2