将python 2.7语法转换为3.3 - sum(map(len,P))

时间:2014-02-05 09:52:45

标签: python python-2.7 syntax

我有一个程序可以使用Python 2.7而不是python 3.3当然我知道我需要使用范围而不是xrange,add()用于打印等。但程序有很多'map'方法和它似乎造成了问题。当我收到此错误时:TypeError: object of type 'map' has no len()我只是将它作为字符串转换而且它有效。

我无法弄清楚如何转换是这个表达式: sum(map(len,P)) 我收到此错误:TypeError: object of type 'map' has no len() 但是这次我不确定要演绎什么以及如何演出。 如果有帮助,我可以发布整个代码。

这是P的初始化方式:

P, Q = [line.strip().lstrip('(').rstrip(')').split(')(') for line in input_data.readlines()]
P = [map(int, perm_cycle.split()) for perm_cycle in P]

4 个答案:

答案 0 :(得分:2)

而不是

P = [map(int, perm_cycle.split()) for perm_cycle in P]' 

使用

P = [list(map(int, perm_cycle.split())) for perm_cycle in P]'

问题出现是因为你试图稍后调用len(map(...))在Python 2中工作但在Python 3中不工作,因为Python 3懒惰地评估这个map(它是那里的生成器)。在它周围运行显式list以消除懒惰并获得真实列表。

但是认为你可以完全剥离map因为如果你只对列表的长度感兴趣,就不需要以某种方式mapmap ping它不会改变它的大小。

这意味着评估这个:

sum(map(len, perm_cycle.split()))

代替。

答案 1 :(得分:1)

您可以先将P的每个元素转换为列表:

map(lambda x: len(list(x)), P)

或者:

map(len, map(list, P))

更好的方法是关注@Alfe回答。

这是一个简单的(虽然不完美)规则:在Python3中将Python2 map(...)替换为list(map(...))

答案 2 :(得分:0)

Python 3中,map返回一个迭代器,而在Python 2中则返回一个列表。您可以通过调用list(iterator)来构建迭代器中的列表。

所以你需要将P改为:

P = [list(map(int, perm_cycle.split())) for perm_cycle in P]

然后P的元素可以传递给len

改变它的另一种方法是将表达式设为:

sum(len(list(item) for item in P)

您始终可以使用Python 3中的generator expression替换map来电(在2中您将其替换为列表解析)。

答案 3 :(得分:0)

您可以使用map严格评估list(map),因此len(map(len, P))或类似的表达式在Python3中仍然有效。

基本上,

import sys

if sys.version_info.major > 2:
    import builtins
    def map(f, *args):
        return list(builtins.map(f, *args))