如何在map中将项目作为args列表传递?
这是我代码的一部分。Lambda函数需要3个参数,我想把它们作为一个元组传递,但看起来map
把它们当作一个单独的参数传递了。
我该如何把底部的那些元组作为参数列表传递呢?(我知道我可以重写这个lambda函数,但那样会变得不太容易阅读)
adds = map((lambda j, f, a:
j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''),
((' ', ' -not -path "{0}" ', 'exclude'),
(' -or ', '-path "{0}"', 'include')))
4 个回答
3
另一种选择是使用 itertools.starmap,它可以接受已经打包好的参数:
adds = itertools.starmap((lambda j, f, a:
j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''),
((' ', ' -not -path "{0}" ', 'exclude'),
(' -or ', '-path "{0}"', 'include')))
5
map()
的说明:
map(function, iterable, ...)
这个函数会把你给的函数应用到每一个可迭代的对象(比如列表)里的每一项,然后返回一个结果列表。如果你传入了多个可迭代对象,函数就必须接受相同数量的参数,并且会同时处理所有可迭代对象里的项。如果其中一个可迭代对象比其他的短,它会被自动填充上 None。假如你传入的函数是 None,那么就默认使用一个简单的身份函数;如果有多个参数,
map()
会返回一个包含所有可迭代对象对应项的元组列表(这有点像转置操作)。可迭代对象可以是一个序列或者任何可迭代的对象;结果总是一个列表。
你需要把参数放在并行的列表或元组中,然后把它们作为三个可迭代对象传给 map()
。
3
试着在它们周围加上括号
adds = map((lambda (j, f, a):
j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''),
((' ', ' -not -path "{0}" ', 'exclude'),
(' -or ', '-path "{0}"', 'include')))