Python- zip()内置函数一篇就够了

部署运行你感兴趣的模型镜像

前言:

最近刷题遇到了许多zip(),zip()其实是Python中十分常见的内置函数,用好zip能够帮助你实现一些复杂的功能,本文旨在帮助你完全掌握zip函数

参考文档:内置函数 — Python 3.13.1 文档

1.1基本用法&介绍:

zip(*iterables, strict=False)

zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回有这些元组组成的列表,返回的值也是可迭代的,如果zip多个迭代器的元素个数不一致,则返回列表长度最短的对象相同。

补充:zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。(如果需要了解 Python3 的应用,可以参考 Python3 zip()

极端例子是只有一个可迭代对象参数,zip() 会返回一个一元组的迭代器。如果未给出参数,则返回一个空的迭代器。

返回类型:在多个迭代器上并行迭代,从每个迭代器返回一个数据项组成元组

相关参数:

*iterables :利用*号操作符可以将可迭代器转化为解压成列表,所以*iterables就表示的一个列表或者如果传入的不是列表,只要是可迭代的他会自动解压成列表,然后进行下一步操作,值得注意的是这个参数可以是多个迭代器。值得注意的是不一定zip的第一类参数必须是列表,只要是可迭代的都可以往里面带入。

s = ['val1', 'val2','val3']
for i in zip(s,range(3),'abc'):
    print(i)
#结果:
#('name', 0, 'a')
#('age', 1, 'b')
#('gender', 2, 'c')

strict=False:这个就是一个限制的参数,默认strict是False,即如果zip的多个迭代的元素不一致,返回的元组长度与最短的迭代器的长度相同。,如果修改strict = True,如果zip内迭代器长度不一致,就会报错,所以除非你确定多个迭代器的长度都一直,才修改stric的默认值,否则不用修改其值。

list(zip(range(3), ['A', 'B', 'C', 'D']))
##结果[(0, 'fee'), (1, 'fi'), (2, 'fo')]
#由于其默认值strict是False,所以不会报错

list(zip(range(3), ['A', 'B', 'C', 'D']),strict = True)
#这样就会报错
#ValueError: zip() argument 2 is longer than argument 1

1.2zip小技巧

1.21小技巧一:

如果要将几个不等长的迭代器所有对应元素打包成一个元组,同时如果该下标下没有值就填默认0,,在这种情况下为了让所有迭代对象具有相同的长度,长度较短的可用常量填充。可以用到itertools.zip_longest()来完成,

itertools.zip_longest(*iterablesfillvalue=None)创建一个迭代器,它聚合了来自 iterables 中每一项的对应元素。如果 iterables 中每一项的长度不同,则缺失的值将以 fillvalue 填充。 如果未指定,则 fillvalue 默认为None

1.22小技巧二:

可确保迭代器的求值顺序是从左到右的。这样就能用  zip(*[iter(s)]*n, strict=True) 将数据列表按长度 n 进行分组。这将重复 相同 的迭代器n次,输出的每个元组都包含 n 次调用迭代器的结果。这样做的效果是把输入拆分为长度为 n 的块。值得一提的是n必须为s的长度,否则会出错!

s =  'ABCDEFG'
n = len(s)
for i in zip(*[iter(s)]*n, strict=True):
    print(i)
#结果是    ('A', 'B', 'C', 'D', 'E', 'F', 'G')

1.23小技巧三:

zip() 可以与* 运算符相结合可以用来拆解一个列表:

x = [1, 2, 3]
y = [4, 5, 6]
list(zip(x, y))
#结果: [(1, 4), (2, 5), (3, 6)]
x2, y2 = zip(*zip(x, y))
x == list(x2) and y == list(y2)
#结果: True

1.3运用:

传送门:

这道题目用到了定长滑动窗口,我们先维护一个长度为k的窗口,在每一次从右边增加一个元素,左边减少一个元素,保证窗口长度符合要求,更新答案。 

用zip实现一个遍历in_ 一个遍历out_ 这样可以减少程序的复杂度,增加可读性

from collections import Counter
class Solution:
    def maxSum(self, nums: List[int], m: int, k: int) -> int:
        ans = 0
        s = sum(nums[:k-1]) #先统计k - 1 个数
        cnt = Counter(nums[:k-1])
        for out_,in_ in zip(nums,nums[k-1:]): 
            s += in_
            cnt[in_] += 1
            if len(cnt) >= m:
                ans = max(ans,s)
            
            s -= out_
            cnt[out_] -= 1
            if cnt[out_] == 0:
                del cnt[out_]
        return ans

期待与你共同进步!

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值