python中的reduce内建函数使用方法指南_python

官方解释:

Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterable contains only one item, the first item is returned. Roughly equivalent to:

意思就是说:将一个可迭代的对象应用到一个带有两个参数的方法上,我们称之为appFun,遍历这个可迭代对象,将其中的元素依次作为appFun的参数,但这个函数有两个参数,作为哪个参数呢?有这样的规则,看一下下面reduce方法的实现,有三个参数,第一个参数就是上面说的appFun,第二个参数就是那个可迭代的对象,而第三个呢?当调用reduce方法的时候给出了initializer这个参数,那么第一次调用appFun的时候这个参数值就作为第一个参数,而可迭代对象的元素依次作为appFun的第二个参数;如果调用reduce的时候没有给出initializer这个参数,那么第一次调用appFun的时候,可迭代对象的第一个元素就作为appFun的第一个元素,而可迭代器的从第二个元素到最后依次作为appFun的第二个参数,除第一次调用之外,appFun的第一个参数就是appFun的返回值了。例如reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),计算1到5的和,因为没有给定initializer参数,所以第一次调用x+y时,x=1,即列表的第一个元素,y=2,即列表的第二个元素,之后返回的1+2的结果作为第二次调用x+y中的x,即上一次的结果,y=2,即第二个元素,依次类推,知道得到1+2+3+4+5的结果。

这样看来,其实下面的代码定义是有一点问题,我们在程序中调用这段代码reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),得到的结果为16,而正确的结果为15,问题在于如果集合不是以0开始,那么按照如下代码,第一次调用x=1,即第一个元素,y也是等于1,也是第一个元素,而正确的y应该是2。所以真正的reduce方法应该和下面的例子是有差别的。

def reduce(function, iterable, initializer=None):
  it = iter(iterable)
  if initializer is None:
    try:
      initializer = next(it)
    except StopIteration:
      raise TypeError('reduce() of empty sequence with no initial value')
  accum_value = initializer
  for x in iterable:
    accum_value = function(accum_value, x)
  return accum_value

那么reduce函数能做什么,什么情况下要用reduce呢,看下面的例子:

例如上面的例子,实现一个整形集合的累加。假设lst = [1,2,3,4,5],实现累加的方式有很多:

第一种:用sum函数

sum(lst) 

 
第二种:循环方式。

def customer_sum(lst):
  result = 0
  for x in lst:
    result+=x
  return result 

#或者
def customer_sum(lst):
  result = 0
  while lst:
      temp = lst.pop(0)
      result+=temp
  return result 

if __name__=="__main__":
  lst = [1,2,3,4,5]
  print customer_sum(lst)

第三种:递推求和

def add(lst,result):
  if lst:
    temp = lst.pop(0)
    temp+=result
    return add(lst,temp)
  else:
    return result 

if __name__=="__main__":
  lst = [1,2,3,4,5]
  print add(lst,0)

第四种:reduce方式

lst = [1,2,3,4,5]
print reduce(lambda x,y:x+y,lst)
#这种方式用lambda表示当做参数,因为没有提供reduce的第三个参数,所以第一次执行时x=1,y=2,第二次x=1+2,y=3,即列表的第三个元素 

#或者
lst = [1,2,3,4,5]
print reduce(lambda x,y:x+y,lst,0)
#这种方式用lambda表示当做参数,因为指定了reduce的第三个参数为0,所以第一次执行时x=0,y=1,第二次x=0+1,y=2,即列表的第二个元素,
假定指定reduce的第三个参数为100,那么第一次执行x=100,y仍然是遍历列表的元素,最后得到的结果为115 

#或者
def add(x,y):
  return x+y 

print reduce(add, lst)
#与方式1相同,只不过把lambda表达式换成了自定义函数 

#或者
def add(x,y):
  return x+y 

print reduce(add, lst,0)
#与方式2相同,只不过把lambda表达式换成了自定义函数 

 
再举一个例子:有一个序列集合,例如[1,1,2,3,2,3,3,5,6,7,7,6,5,5,5],统计这个集合所有键的重复个数,例如1出现了两次,2出现了两次等。大致的思路就是用字典存储,元素就是字典的key,出现的次数就是字典的value。方法依然很多

第一种:for循环判断

def statistics(lst):
  dic = {}
  for k in lst:
    if not k in dic:
      dic[k] = 1
    else:
      dic[k] +=1
  return dic 

lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print(statistics(lst))

第二种:比较取巧的,先把列表用set方式去重,然后用列表的count方法

def statistics2(lst):
  m = set(lst)
  dic = {}
  for x in m:
    dic[x] = lst.count(x) 

  return dic 

lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print statistics2(lst)

第三种:用reduce方式

def statistics(dic,k):
  if not k in dic:
    dic[k] = 1
  else:
    dic[k] +=1
  return dic 

lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]
print reduce(statistics,lst,{})
#提供第三个参数,第一次,初始字典为空,作为statistics的第一个参数,然后遍历lst,作为第二个参数,然后将返回的字典集合作为下一次的第一个参数 

或者
d = {}
d.extend(lst)
print reduce(statistics,d)
#不提供第三个参数,但是要在保证集合的第一个元素是一个字典对象,作为statistics的第一个参数,遍历集合依次作为第二个参数

通过上面的例子发现,凡是要对一个集合进行操作的,并且要有一个统计结果的,能够用循环或者递归方式解决的问题,一般情况下都可以用reduce方式实现。

reduce函数真是“一位好同志啊”!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
, reduce
内建函数
python reduce函数、python中reduce函数、python的reduce函数、python3 reduce函数、python中的reduce函数,以便于您获取更多的相关知识。

时间: 2024-10-25 22:19:14

python中的reduce内建函数使用方法指南_python的相关文章

python中异常报错处理方法汇总_python

首先异常是什么,异常白话解释就是不正常,程序里面一般是指程序员输入的格式不规范,或者需求的参数类型不对应,不全等等. Python中异常是指程序中的例外,违例情况.异常机制是指程序出现错误后,程序的处理方法.当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理. 打个比方很多公司年终送苹果笔记本,你程序话思维以为是(MAC)电脑笔记本,结果给你个苹果+笔记本...首先类型不对,数量也不对. 先来看几个常见的报错如下: NameError 命名错误 原因是: name 'a' is n

Python中处理时间的几种方法小结_python

从一个字符串开始 在CODE上查看代码片派生到我的代码片 >>>time_str='2008-08-08 08:08:08'  1.1.转换为struct_time形式的时间   在CODE上查看代码片派生到我的代码片 >>struct = ime.strptime(time_str,'%Y-%m-%d %H:%M:%S') time.struct_time(tm_year=2008, tm_mon=8, tm_mday=8, tm_hour=8, tm_min=8, tm_

在Python中操作字典之clear()方法的使用

  这篇文章主要介绍了在Python中操作字典之clear()方法的使用,是Python入门的基础知识,需要的朋友可以参考下 clear()方法将删除字典中的所有项目(清空字典) 语法 以下是clear()方法的语法: ? 1 dict.clear() 参数 NA 返回值 此方法不返回任何值. 例子 下面的例子显示了clear()方法的使用 ? 1 2 3 4 5 6 7 #!/usr/bin/python   dict = {'Name': 'Zara', 'Age': 7};   print

在Python中操作字典之fromkeys()方法的使用

  这篇文章主要介绍了在Python中操作字典之fromkeys()方法的使用,是Python入门的基础知识,需要的朋友可以参考下 fromkeys()方法从序列键和值设置为value来创建一个新的字典. 语法 以下是fromkeys()方法的语法: ? 1 dict.fromkeys(seq[, value])) 参数 seq -- 这是将用于字典的键准备的值的列表. value -- 这是可选的,如果提供的话则值将被设置为这个值 返回值 此方法返回列表. 例子 下面的例子显示fromkeys

在Python中操作字典之setdefault()方法的使用

  这篇文章主要介绍了在Python中操作字典之setdefault()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 setdefault()方法类似于get()方法,但会设置字典[键]=默认情况下,如果键不是已经在字典中. 方法 以下是setdefault()方法的语法: ? 1 dict.setdefault(key, default=None) 参数 key -- 这是要被搜索的键 default -- 这是没有找到键的情况下返回的值. 返回值 此方法返回字典可用的

在Python中处理字符串之isdecimal()方法的使用

  这篇文章主要介绍了在Python中处理字符串之isdecimal()方法的使用,是Python入门学习的基础知识,需要的朋友可以参考下 isdecimal()方法检查字符串是否仅由十进制字符组成.此方法只存在于unicode对象. 注意:要定义一个字符串为Unicode,只需前缀分配'u'左引号.以下是示例. 语法 以下是isdecimal()方法的语法: ? 1 str.isdecimal() 参数 NA 返回值 如果字符串中的所有字符为十进制此方法返回true,否则返回false. 例子

在Python中操作文件之truncate()方法的使用教程

  这篇文章主要介绍了在Python中操作文件之truncate()方法的使用教程,是Python入门学习中的基础知识,需要的朋友可以参考下 truncate()方法截断该文件的大小.如果可选的尺寸参数存在,该文件被截断(最多)的大小. 大小默认为当前位置.当前文件位置不改变.注意,如果一个指定的大小超过了文件的当前大小,其结果是依赖于平台. 注意:此方法不会在当文件工作在只读模式打开. 语法 以下是truncate()方法的语法: ? 1 fileObject.truncate( [ size

Python中操作文件之write()方法的使用教程

  这篇文章主要介绍了Python中操作文件之write()方法的使用教程,是Python入门学习中的基础知识,需要的朋友可以参考下 write()方法把字符串str写入文件.没有返回值.由于缓冲,字符串可能不实际显示文件,直到flush()或close()方法被调用. 语法 以下是write()方法的语法: ? 1 fileObject.write( str ) 参数 str -- 这是要被写入的文件中的字符串. 返回值 此方法不返回任何值. 例子 下面的例子显示write()方法的使用. ?

在Python中操作文件之read()方法的使用

  这篇文章主要介绍了在Python中操作文件之read()方法的使用教程,是Python入门学习中的基础知识,需要的朋友可以参考下 read()方法读取文件size个字节大小.如果读取命中获得EOF大小字节之前,那么它只能读取可用的字节. 语法 以下是read()方法的语法: ? 1 fileObject.read( size ); 参数 size -- 这是可以从文件中读取的字节数. 返回值 此方法返回读取字符串中的字节数. 例子 下面的例子显示了read()方法的使用. ? 1 2 3 4