我想在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.
答案 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,将其作为列表或元组..