Python:没有类型列表作为参数的Map函数

时间:2013-04-22 16:19:09

标签: python list nonetype map-function

我想在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 个答案:

答案 0 :(得分:1)

None替换为空列表:

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

或过滤列表:

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

filter()调用会从列表中删除d,而第一个选项会为您的函数调用提供None值。

我删除了lambda,这里多余了。

使用or []选项,第四个参数为None

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

过滤会产生func1的3个参数:

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

答案 1 :(得分:0)

制作第二个参数以映射列表或元组:

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

答案 2 :(得分:0)

错误消息几乎说明了一切:None不可迭代。 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,而不使用lambda:

map(func1, *iterables)

答案 3 :(得分:0)

第二个参数d应该是SEQUENCE,将其作为列表或元组..