我有一个程序可以使用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]
答案 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
因为如果你只对列表的长度感兴趣,就不需要以某种方式map
。 map
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))