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

时间:2009-12-07 08:54:26

标签: python map arguments

这是我的一段代码。 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 个答案:

答案 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'))]