Python: map()在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)

代替list.append(map(.....可能有多个地图?))

更新:

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里最烂的东西了

我将使用itertools.product:

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

如果你绝对需要map:

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)))

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

您不希望/需要map:

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

如果您可以做map(somefunc, somelist)之类的事情,则使用map将是合适的。如果不是这种情况,你就需要一个lambda,它只会比列表推导式增加不必要的开销。

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

如果可以使用list comprehension,为什么要使用map呢?

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

最新更新