减少Python中的功能

时间:2011-08-21 17:09:47

标签: python

我使用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'),但我想知道是否可以使用简化解决方案。

7 个答案:

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

但是有很多方法可以让它更自然:

  • 使用list comprehensions而不是reduce
  • 使用运算符包而不是定义自己的添加功能
  • 用户itertools

(上面的反建议真的很酷 - 我认为我甚至都不知道存在。)

更简单(但效率不高)的方法是:

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)

python中的自定义化简函数

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)))