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运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun