Python中的Reduce函数

Python中的Reduce函数,python,Python,我使用函数将列表中的所有元素相乘,如下所示 l = [1,2,3,4,5] reduce(lambda x,y:x*y,l) #returns 120 现在,假设我有一个列表,l=[1,'apple',2,'apple','apple'],我想计算“apple”一词在列表中出现的次数。使用reduce可以吗 我知道我可以使用l.count('apple'),但我想知道reduce解决方案是否可行。这是使用初始值设定项(reduce调用结束时的额外0)最简单的方法,因此您只需要转换第二个参数:

我使用函数将列表中的所有元素相乘,如下所示

l = [1,2,3,4,5]
reduce(lambda x,y:x*y,l) #returns 120
现在,假设我有一个列表,
l=[1,'apple',2,'apple','apple']
,我想计算“apple”一词在列表中出现的次数。使用reduce可以吗


我知道我可以使用
l.count('apple')
,但我想知道reduce解决方案是否可行。

这是使用初始值设定项(reduce调用结束时的额外
0
)最简单的方法,因此您只需要转换第二个参数:

reduce(lambda x, y: x + (1 if y=='apple' else 0), [1,'apple',2,'apple','apple'], 0)
或者,您可以将已通过贴图转换的内容减少为0和1:

reduce(lambda x, y: x+y, map(lambda x: 1 if x=='apple' else 0,  [1,'apple',2,'apple','apple']))
但有很多方法可以让这更自然:

  • 使用列表理解,而不是减少
  • 使用operators包,而不是定义自己的函数进行添加
  • 用户itertools
(上面的反建议真的很酷——我想我甚至都不知道它的存在。)

更简单(但不是很有效)的方法是:

len([x for x in [1,'apple',2,'apple','apple'] if x=='apple'])
是的,它是:

reduce(lambda x,y: x + (y == 'apple'), l, 0)
但正如您所提到的,这里没有必要使用
reduce
。它很可能比任何其他计数方法都慢,而且其意图目前尚不清楚

>>> l = [1,'apple',2,'apple','apple']
>>> reduce(lambda s, i: s+1 if i == "apple" else s, l, 0)
3
如果i==“apple”else s部分为
s+(i==“apple”)
,则可以将
s+1简化为
s+,但我认为隐式bool=>int转换是神秘的。但是使用reduce来完成这项工作是很神秘的:)。

如果您使用“real”函数而不是lambda函数,这样的问题的解决方案通常会变得更加清晰:

def count_apples(acc, v):
   if v == 'apple':
      return acc+1
   else:
      return acc

l = [1,'apple',2,'apple','apple']
print reduce(count_apples, l, 0)
结果

0.0616016840129
0.124420003101
True

产生

0.0110332458455
0.0428308625817
0.0518741907142
True
python中的自定义reduce函数
谢谢你的回答。你能举个例子吗?有一点是肯定的:如果你想问一个与家庭作业有关的问题,你应该叫自己吉尔,而不是詹姆斯()。吉尔得到5个答案,詹姆斯得到-5票。。是的,我承认这本书是用一种更好的方式写的。很有趣,就是这样。哈!这真是太棒了(令人沮丧,而且无法预测)。我保证我刚打开了电脑…@DSM:这也不是同一个问题。@sepp2k:是的,这是一个不同的问题——正如我所说,写得更好,因为这一个提到了意识到实现目标的其他方法。当然,如果是同一个问题会更有趣,因为它得到了截然不同的回答,但是同一个作者,同一个作业,两个小时内相同的Python函数对于一个懒散的下午来说并不坏。嘿,艾奎姆。这些计时很有趣,但问题不在于性能,而在于如何使用
reduce
实现“计数”。你应该只把一些东西作为回答,如果它特别针对这个问题。我知道这太大了,不能放在评论里,但这仅仅意味着它不适合这个网站。输出将是15
0.0616016840129
0.124420003101
True
li = [1,78,2,2,12,45,1,2,8,1,2,5,4,2]


te = clock()
for i in xrange(n):
    x = li.count(2)
print clock()-te

te = clock()
for i in xrange(n):
    y = sum(1 for a in li if a==2)
print clock()-te

te = clock()
for i in xrange(n):
    z = len([a for a in li if a==2])
print clock()-te

print x==y==z
0.0110332458455
0.0428308625817
0.0518741907142
True
def my_reduce(func,sequence) :
    res=sequence[0]
    for variable in sequence[1:]:
        res =func(variable,res)

    return res


def my_sum(a,b):
    return a+b


seq=[1,2,3,4,5]
print(str(my_reduce(my_sum,seq)))