这是我的一段代码。 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')))
答案 0 :(得分:5)
map()
说明:
map(function, iterable, ...)
将函数应用于iterable的每个项目并返回结果列表。 如果传递了其他可迭代参数,则函数必须使用那么多参数,并且并行应用于所有可迭代的项。如果一个iterable比另一个短,则假定使用None项扩展。如果function为None,则假定为identity函数;如果有多个参数,map()返回一个由包含所有迭代中相应项的元组组成的列表(一种转置操作)。可迭代参数可以是序列或任何可迭代对象;结果总是一个列表。
您需要将参数放在并行列表或元组中,并将它们作为3次迭代传递给map()
。
答案 1 :(得分:3)
尝试在它们周围放置parens
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')))
答案 2 :(得分: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')))
答案 3 :(得分:1)
一种方法是重写为列表理解:
adds = [
j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''
for j, f, a in
((' ', ' -not -path "{0}" ', 'exclude'),
(' -or ', '-path "{0}"', 'include'))]