python:map()在迭代器中使用变量进行两次迭代

时间:2013-06-10 16:51:11

标签: python python-2.7 map

有没有办法将以下行包含为地图?

   alist = []
   for name in range(4):
            for sname in range(15):
                final = Do_Class(name, sname) #Is a class not to be bothered with
                alist.append(final)

而不是alist.append(地图(.....多个地图可能?))

更新:

x = [Do_Class(name, sname) for name in xrange(15) for sname in xrange(4)]
alist = [i for i in x]

上述工作没有错误

alist = [i for i in Do_Class(name, sname) for name in xrange(15) for sname in xrange(4)]

抛出UnboundLocalError:在赋值

之前引用的局部变量'sname'

这必须是Python中最蹩脚的东西

4 个答案:

答案 0 :(得分:3)

您不希望/需要map

alist = [Do_Class(name, sname) for sname in range(15) for name in range(4)]

使用map只适用于map(somefunc, somelist)之类的内容。如果不是这种情况,你需要一个lambda,与列表理解相比,这只会增加不必要的开销。

答案 1 :(得分:3)

我会使用itertools.product

from itertools import product
alist = [Do_Class(x[0], x[1]) for x in product(range(4), range(15))]

如果你绝对需要地图:

alist = map(lambda x: Do_Class(x[0], x[1]), product(range(4), range(15)))

如果您想要更短的版本,但可读性更低:

alist = map(Do_Class, sorted(range(4)*15), range(15)*4)

修改

需要对范围(4)* 15进行排序以获得0,0,0,...,1,...而不是0,1,2,3,0 ......

编辑2

我偶然发现了itertools.starmap,这应该是这样的:

from itertools import starmap
from itertools import product
alist = starmap(Do_Class, product(range(4), range(15)))

认为这也是一个很好的解决方案。

答案 2 :(得分:0)

alist = map(lambda name : map(lambda sname : Do_Class(name, sname), range(15)), range(4)) #please don't do this

答案 3 :(得分:0)

为什么在只使用map时使用list comprehension

alist = [Do_Class(name, sname) for sname in range(15) for name in range(4)]

这应该比map足够和高效。

如果您确实需要map,可以执行以下操作:

alist = map(lambda x: Do_Class(x[0], x[1]), [(name, sname) for sname in range(15) for name in range(4)])