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)。そうでない場合は、リスト内包表記と比較して不要なオーバーヘッドを追加するラムダが必要になります。

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

どうしても 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)

編集

0, 1, 2, 3, 0, ... ではなく 0, 0, 0, ..., 1, ... を取得するには、range(4)*15 を並べ替える必要があります。

編集 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 に答える