你能直接将一个操作应用于map / reduce / filter中的参数吗?

时间:2012-07-09 20:28:14

标签: python syntax iteration readability

mapfilter通常可以与列表推导互换,但reduce并不像mapfilter那样轻易换出(此外,在某些情况下,我仍然更喜欢功能语法)。但是,当你需要对参数本身进行操作时,我会发现自己正在进行语法体操,并最终必须编写完整的函数来保持可读性。

我会使用map来简化插图单元测试,但请记住,真实的用例可能更难以表达为列表理解。

我发现了两种混乱的方法,但我实际上并没有使用它。

[afunc(*i) for i in aniter] == map(afunc, *zip(*aniter))
[afunc(*i) for i in aniter] == map(lambda i: apply(afunc, i), aniter)

是否有任何简洁,优雅的方式来表达这些表达方式的右手边?

1 个答案:

答案 0 :(得分:11)

查看itertools了解能让您的生活更轻松的工具。

例如,您发布的代码已作为itertools.starmap提供。

itertools.starmap(afunc, aniter)

来自文档:

  

创建一个迭代器,使用从iterable获得的参数计算函数。当参数参数已经从单个可迭代的元组中分组时(数据已被“预压缩”),使用而不是imap()。 imap()和starmap()之间的区别与函数(a,b)和函数(* c)之间的区别相似。相当于:

def starmap(function, iterable):
   # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
   for args in iterable:
       yield function(*args)

itertools中隐藏了其他好东西,所以我建议您仔细阅读文档,看看是否还有其他可以使用的东西。 recipes部分还显示了可以使用itertools中可用功能解决各种问题的方法。即使你找不到能够解决你的确切要求的食谱,你也可以使用一些作为灵感来源的想法。