6

mapandfilter通常可以与列表推导互换,但reduce不像mapand那样容易交换filter(此外,在某些情况下,我仍然更喜欢函数式语法)。但是,当您需要对参数本身进行操作时,我发现自己正在经历句法体操,最终不得不编写整个函数以保持可读性。

我将map用来保持插图单元测试的简单性,但请记住,现实生活中的用例可能更难表达为列表理解。

我找到了两种混乱的方法来解决它,但我实际上不会使用任何方法。

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

有没有什么简洁、优雅的方式来表达这些表达式的右手边?

4

1 回答 1

11

查看itertools以获取可以让您的生活更轻松的工具。

例如,您发布的代码已经作为itertools.starmap.

itertools.starmap(afunc, aniter)

从文档中:

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

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

中还隐藏着大量其他好东西itertools,因此我建议您通读文档以查看是否还有其他可以使用的东西。食谱部分还展示了您可以使用其中的可用功能来itertools解决各种问题的方法。即使您找不到能够满足您确切要求的配方,您也可能可以将展示的一些想法用作灵感来源。

于 2012-07-09T20:30:36.343 回答