如何在map中将项目作为args列表传递?

1 投票
4 回答
4212 浏览
提问于 2025-04-15 16:45

这是我代码的一部分。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')))

撰写回答