Python itertools中accumulate函数用法及使用运用详细讲解

本文主要是介绍Python itertools中accumulate函数用法及使用运用详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数...

1.1前言:

本文将详细讲解itertools中的accumulate,accumulate函数可以在前缀和中运用,否则就需要每次移动的时候维护一个前缀和,大家如果不知道前缀和也可以先了解一下前缀和,前缀和可以解决数组区间和查询问题、矩阵区域和查询问题、连续子数组和问题、最大子段和问题、最大子矩阵和问PzQGzb题这里,但是如果大家不太了解前缀和也可以放心食用,因为运用这个累加函数其实十分简单。

1.2定义:

itertools. accumulate(iterable[,function,*,initial = None])

创建一个返回累积汇总值或来自其他双目运算函数的累积结果的迭代器。function 默认为加法运算。 function 应当接受两个参数,即一个累积汇总值和一个来自 iterable 的值。如果提供了 initial 值,将从该值开始累积并且输出将比输入可迭代对象多一个元素。

大家也可以自行实现前缀和,第一种是简易写法,这种写法其实已经满足很多前缀和的题目了,

pre_num = [0]
#由于为了满足前缀和的性质第一个数一定要置零才能满足所有的数都可以由两个前缀和来表示
for idx,x in enumerate(nums):
 
    pre_num.append(pre_num[idx] + x)

accumulate大致相当于: 

def accumulate(iterable, function=operator.add, *, initial=None):
    'Return running totals'
    # accumulate([1,2,3,4,5]) → 1 3 6 10 15
    # accumulate([1,2,3,4,5], initial=100) → 100 101 103 106 110 115
    # accumulate([1,2,3,4,5], operator.mul) → 1 2 6 24 120

    iterator = iter(iterable)
    total = initial
    if initial is None:
        try:
            total = next(iterator)
        except StopIteration:
            return

    yield total
    for element in iterator:
        total = function(total, element)
        yield total

 值得注意的是如下用法放回的是地址而不是元素的值

temp = itertools.accumulate([1,2,3,4,5,6], initial = 0)

##结果:<itertools.accumulate object at 0x00000193FA04D990>

如果要返回元素的值还需要如下操作: 

temp = list(itertools.accumulate([1,2,3,4,5,6], initial = 0))

1.3衍生用法:

刚才我们也提到了accumulate里面有个参数是function,这个函数默认是累加方法,但是用户也可以自己自己设定方法,比如max , min,等其他。

data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
list(accumulate(data, max))              # 运行最大值
##结果[3, 4, 6, 6, 6, 9, 9, 9, 9, 9]

list(accumulate(data, operator.mul))     # 运行乘积
##结果[3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]

##题目: 分期偿还利率 5% 总额 1000 的货款,每年还款 10www.chinasem.cn 次,每次 90
update = lambda balance, payment: round(balance * 1.05) - payment
list(accumulate(repeat(90, 10), update, initial=1_000))
China编程##结果[1000, 960, 918, 874, 828, 779, 728, 674, 618, 559, 497]

1.3Leetcode的实际运用:

Eg1:使数组元素全部相等的最少操作次数:

给你一个正整数数组 nums 。同时给你一个长度为 m 的整数数组 queries 。第 i 个查询中,你需要将 nums 中所有元素变成 queries[i] 。你可以执行以下操作 任意 次:

  • 将数组里一个元素 增大 或者 减小 1 。

请你返回一个长度为 m 的数组 answer ,其中 answer[i]是将 nums 中所有元素变成 queries[i] 的 最少 操作次数。

注意,每次查询后,数组变回最开始的值。

示例 1:

输入:nums = [3,1,6,8], queries = [1,5]

输出:[14,10]

解释:第一个查询,我们可以执行以下操作:
- 将 nums[0] 减小 2 次,nums = [1,1,6,8] 。
- 将 nums[2] 减小 5 次,nums = [1,1,1,8] 。
- 将 nums[3] 减小 7 次,nums = [1,1,1,1] 。
第一个查询的总操作次数为 2 + 5 + 7 = 14 。
第二个查询,我们可以执行以下操作:
- 将 nums[0] 增大 2 次,nums = [5,1,6,8] 。
- 将 nums[1] 增大 4 次,nums = [5,5,6,8] 。
- 将 nums[2] 减小 1 次,nums = [5,5,5,8] 。
- 将 nums[3] 减小 3 次,nums = [5,5,5,5] 。
第二个查询的总操作次数为 2 + 4 + 1 + 3 = 10 。

#题解参考万能的灵神:

Python itertools中accumulate函数用法及使用运用详细讲解

本题采用数组排序后,二分找q的位置,其中蓝色的面积+绿色的面积即为答案,并且本题可以采用前缀和优化

class Solution:
    def minOperations(self, nums: List[int], queries: List[int]) -> List[int]:
        nums.sort()
        n = len(nums)
        s = list(accumulate(nums,initial = 0)) ##前缀和
        ans = []
        for q in queries:
            j = bisect_left(nums, q) 
            left = q * j - s[j] #蓝色面积
            right = s[n] - s[j] - q*(n - j) #绿色的面积
            ans.append(left + right)
        return ans

 Eg2:执行操作频率分数最大:(注意本题和上题十分类似,只是本题是前缀和+滑动窗口)

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你可以对数组执行 至多 k 次操作:

  • 从数组中选择一个下标 i ,将 nums[i] 增加 或者 减少 1 。
  • 最终数组的频率分数定义为数组中众数的 频率 。

请你返回你可以得到的 最大 频率分数。众数指的是数组中出现次数最多的数。一个元素的频率指的是数组中这个元素的出现次数。

示例 1:

输入:nums = [1,2,6,4], k = 3

输出:3

解释:我们可以对数组执行以下操作:
- 选择 i = 0 ,将 nums[0] 增加 1 。得到数组 [2,2,6,4] 。
- 选择 i = 3 ,将 nums[3]javascript 减少 1 ,得到数组 [2,2,6,3] 。
- 选择 i = 3 ,将 nums[3] 减少 1 ,得到数组 [2,2,6,2] 。
元素 2 是最终数组中的众数,出现了 3 次,所以频率分数为 3 。3 是所有可行方案里的最大频率分数。l

灵神题解:数组排序后,要变成一样的数必然在一个连续子数组中,那么用滑动窗口来做,枚举子数组的右端点 right,然后维护子数组的左端点 left。根据中位数贪心,最优做法是把子数组内的元素都变成子数组的中位数,操作次数如果超过 k,就必须移动左端点。求出数组的前缀和,就可以 O(1) 算出操作次数了,

from itertools import accumulate

class Solution:
    def maxFrequencyScore(self, nums: List[int], k: int) -> int:
        #前缀和的知识,注意前缀和s[0] == 0 这样定义有一个好处就是任意子数组包括前缀哦都可以表示为两个前缀和的差
        #中位数贪心,将所有元素变为nums的中位数是最优
        nums.sort()##最开始忘了要排序
        pre_sum = list(accumulate(nums, initial = 0))
        #由于第一个数字是零所以整个长度就是n + 1
        def distance_sum(left , right) -> int:
            mid = ( right + left ) // 2
            left_sum = nums[mid] * (mid - left) - (pre_sum[mid] - pre_sum[left]) 
            right_sum = pre_sum[right+1] - pre_sum[mid+1] - (right - mid) * nums[mid]
            return left_sum + right_sum

        left = ans = 0              #滑动窗口
        for right  in range(len(njavascriptums)):
            while distance_sum(left,right) > k :
                left += 1
            ans = max(ans,right - left + 1)
        return ans

总结 

到此这篇关于python itertools中accumulate函数用法及使用运用详细讲解的文章就介绍到这了,更多相关Python itertools中accumulate函数用法内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Python itertools中accumulate函数用法及使用运用详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153460

相关文章

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec