前言:
最近刷题遇到了许多zip(),zip()其实是Python中十分常见的内置函数,用好zip能够帮助你实现一些复杂的功能,本文旨在帮助你完全掌握zip函数
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(*iterables, fillvalue=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
期待与你共同进步!

1305

被折叠的 条评论
为什么被折叠?



