0

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

   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(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 中最蹩脚的东西

4

4 回答 4

3

你不想要/不需要map这个:

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

map当您可以执行类似map(somefunc, somelist). 如果不是这种情况,您将需要一个 lambda,与列表推导相比,它只会增加不必要的开销。

于 2013-06-10T16:51:57.207 回答
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)

编辑

需要对 range(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)))

认为这也是一个不错的解决方案。

于 2013-06-10T17:09:31.827 回答
0
alist = map(lambda name : map(lambda sname : Do_Class(name, sname), range(15)), range(4)) #please don't do this
于 2013-06-10T16:57:11.320 回答
0

map当您可以简单地使用 a 时,为什么还要使用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)]) 
于 2013-06-10T17:12:09.310 回答