@[TOC](python3 函数总结 zip() 、zip_longest()、unzip() 附习题)
前言
今天在LC上做每日一题 发现一个非常有趣的函数 我觉着有必要把 zip() 打包迭代类的函数给总结一下,这样也阻止自己忘记,喜欢的朋友点赞收藏哦!
提示:以下是本篇文章正文内容,下面案例可供参考
一、zip()和zip(*)函数
- zip()函数 打包等长度的两个数组;
- zip(*) 函数 打包反向操作 ,有点解压缩数组的意思;
- 下面来一道题 一看就明白了!
题目链接:436. 寻找右区间
题目大意:给你一个区间数组 intervals ,其中 intervals[i] = [starti , endi ] ,且每个 starti 都 不同 。
区间 i 的 右侧区间 可以记作区间 j ,并满足 startj= endi ,且 startj 最小化 。
返回一个由每个区间 i 的 右侧区间 在 intervals 中对应下标组成的数组。如果某个区间 i 不存在对应的 右侧区间 ,则下标 i 处的值设为 -1 。
例如:
输入:intervals = [[1,2]]
输出:[-1]
解释:集合中只有一个区间,所以输出-1。
输入:intervals = [[3,4],[2,3],[1,2]]
输出:[-1,0,1]
解释:对于 [3,4] ,没有满足条件的“右侧”区间。
对于 [2,3] ,区间[3,4]具有最小的“右”起点;
对于 [1,2] ,区间[2,3]具有最小的“右”起点。
输入:intervals = [[1,4],[2,3],[3,4]]
输出:[-1,2,-1]
解释:对于区间 [1,4] 和 [3,4] ,没有满足条件的“右侧”区间。
对于 [2,3] ,区间 [3,4] 有最小的“右”起点。
- 解题思路:先排序 再根据区间右端点位置大小判断即可。
- 时间复杂度: O ( N ) O(N) O(N) ,N为数组长度
- 空间复杂度: O ( N ) O(N) O(N)
class Solution:
def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
n = len(intervals)
# zip 打包 zip(*) 解压缩
# zip(*intervals) 反向解压缩
starts,ends = list(zip(*intervals))
# 带着序号进行排序
starts = sorted(zip(starts,range(n)))
ends = sorted(zip(ends,range(n)))
ans,j = [-1]*n,0
for end,idx in ends:
while j<n and starts[j][0] < end:
j += 1
if j<n:
ans[idx] = starts[j][1]
return ans
二、zip_longest() 函数
- 打包不等长字符串
题目链接:1768. 交替合并字符串
题目大意:给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
例如:
输入:word1 = "abc", word2 = "pqr"
输出:"apbqcr"
解释:字符串合并情况如下所示:
word1: a b c
word2: p q r
合并后: a p b q c r
输入:word1 = "ab", word2 = "pqrs"
输出:"apbqrs"
解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。
word1: a b
word2: p q r s
合并后: a p b q r s
输入:word1 = "abcd", word2 = "pq"
输出:"apbqcd"
解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。
word1: a b c d
word2: p q
合并后: a p b q c d
- 解题思路:简单题,按题意做即可。
- 时间复杂度: O ( M + N ) O(M+N) O(M+N) ,M,N分别为数组word1与word2的长度
- 空间复杂度: O ( M + N ) O(M+N) O(M+N)
class Solution:
def mergeAlternately(self, word1: str, word2: str) -> str:
ans = list()
for a,b in zip_longest(word1,word2):
if a: ans.append(a)
if b: ans.append(b)
return ''.join(ans)
"""
m,n = len(word1),len(word2)
ans = ''
for i in range(m):
ans += word1[i]
if i<n:
ans += word2[i]
j = i
while j < n-1:
j += 1
ans += word2[j]
return ans
"""
三、总结
本篇blog主要是对刷题过程中的三个常用的打包函数进行总结,下次就不能在犯迷糊了!努力奋斗。