0

map 関数で None のリストを渡したいのですが、うまくいきません。

a = ['azerty','uiop']
b = ['qsdfg','hjklm']
c = ['wxc','vbn']
d = None

def func1(*y):
    print 'y:',y

map((lambda *x: func1(*x)), a,b,c,d)

次のメッセージ エラーがあります。

TypeError: argument 5 to map() must support iteration.
4

4 に答える 4

1

None空のリストに置き換えます:

map(func1, a or [], b or [], c or [], d or [])

またはリストをフィルタリングします。

map(func1, *filter(None, (a, b, c, d)))

filter()呼び出しはリストから完全に削除さdれますが、最初のオプションはNone関数呼び出しに値を与えます。

ラムダを削除しました。ここでは冗長です。

or []オプションを指定すると、第 4 引数は次のようにNoneなります。

>>> map(func1, a or [], b or [], c or [], d or [])
y: ('azerty', 'qsdfg', 'wxc', None)
y: ('uiop', 'hjklm', 'vbn', None)
[None, None]

フィルタリングすると、次の 3 つの引数が返されますfunc1:

>>> map(func1, *filter(None, (a, b, c, d)))
y: ('azerty', 'qsdfg', 'wxc')
y: ('uiop', 'hjklm', 'vbn')
[None, None]

itertools.starmap()同様に使用できますが、少し冗長になります。

>>> list(starmap(func1, zip(*filter(None, (a, b, c, d)))))
y: ('azerty', 'qsdfg', 'wxc')
y: ('uiop', 'hjklm', 'vbn')
[None, None]
于 2013-04-22T16:23:31.257 に答える
0

リストまたはタプルをマップする 2 番目の引数を作成します。

map((lambda *x): func1(*x)), (a,b,c,d))
于 2013-04-22T16:22:26.010 に答える
0

エラーメッセージはほとんどすべてを物語っています: Noneis not iterable. への引数は反復可能でmapなければなりません:

map(func, *iterables) --> map object

Make an iterator that computes the function using arguments from
each of the iterables.  Stops when the shortest iterable is exhausted.

達成したい内容に応じて、次のことができます。

  • None空のリストに変更します。
  • mapあなたの関数のリスト[a, b, c, d]

func1また、ラムダなしで直接マップできることにも注意してください。

map(func1, *iterables)
于 2013-04-22T16:22:59.950 に答える