我使用reduce函数将列表中的所有元素相乘,如下所示。
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')
,但我想知道是否可以使用简化解决方案。
答案 0 :(得分:6)
是的:
reduce(lambda x,y: x + (y == 'apple'), l, 0)
但正如您自己提到的,此处无需使用reduce
。它可能会比任何其他计数方法慢,并且意图不会立即明确。
答案 1 :(得分:2)
这是最简单的使用初始化程序(在调用结束时额外的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']))
但是有很多方法可以让它更自然:
(上面的反建议真的很酷 - 我认为我甚至都不知道存在。)
更简单(但效率不高)的方法是:
len([x for x in [1,'apple',2,'apple','apple'] if x=='apple'])
答案 2 :(得分:2)
>>> l
[1, 'apple', 2, 'apple', 'apple']
>>> reduce(lambda x, y: x + (1 if y == 'apple' else 0), l, 0)
3
答案 3 :(得分:2)
>>> l = [1,'apple',2,'apple','apple']
>>> reduce(lambda s, i: s+1 if i == "apple" else s, l, 0)
3
您可以将s+1 if i == "apple" else s
部分简化为s + (i == "apple")
,但我认为隐式bool => int转换是神秘的。但无论如何,使用reduce来完成这项工作是神秘的:)。
答案 4 :(得分:1)
如果您使用“真实”函数而不是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)
答案 5 :(得分:0)
from operator import mul
from time import clock
n= 10000
li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
te = clock()
for i in xrange(n):
x = reduce(mul,li)
print clock()-te
te = clock()
for i in xrange(n):
y = reduce(lambda a,b: a*b,li)
print clock()-te
print x==y
结果
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
答案 6 :(得分:0)
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)))