python基础之zip函数
在力扣上做题时,发现了简便解法用到zip函数,因此来学习一下。
参考网址:https://blog.csdn.net/weixin_41599977/article/details/89386629
开始实践:
实例1:
1 a = "abcd" 2 b = "12345" 3 c = zip(a, b) 4 print(list(c))
结果
[('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')]
解析1:
若有2个长度不同字符串,则以最小长度为最终列表长度,将对应位置以元组形式组合起来。之所以要list(c),是因为c赋值后是一个对象,要打印看的话需要先list一下。
实例2:
1 a = ["a", "b", "c"] 2 b = [1, 2, 3, 4] 3 c = zip(a, b) 4 print(list(c))
结果
[('a', 1), ('b', 2), ('c', 3)]
解析2:
若有2个长度不同列表,则以最小长度为最终列表长度,将对应位置以元组形式组合起来。之所以要list(c),是因为c赋值后是一个对象,要打印看的话需要先list一下。
实例3:
1 a = ["a", "b", "c"] 2 b = "321" 3 c = zip(a, b) 4 print(list(c))
结果
[('a', '3'), ('b', '2'), ('c', '1')]
解析3:
将1-3个实例延伸一下就是,将两个迭代对象的对应位置以元组形式组合起来,取最小迭代对象长度为最终列表长度。
实例4:
1 a = ["a123", "bsgvs", "cfr45"] 2 c = zip(*a) 3 print(list(c))
结果
[('a', 'b', 'c'), ('1', 's', 'f'), ('2', 'g', 'r'), ('3', 'v', '4')]
解析4:
可迭代对象元素也是迭代对象的话,将子迭代对象的对应位置以元组形式组合起来,取最小子迭代对象长度为最终列表长度。
得出结论:
zip(a, b)是将两个迭代对象a和b的对应位置以元组形式组合起来,取最小迭代对象长度为最终列表长度。
zip(*a)是将迭代对象a的元素对象的对应位置以元组形式结合起来,取最小元素长度为最终列表长度。
力扣题目:
14. 最长公共前缀:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
第一次解题用的笨方法,扫描每个字符串,找出公共前缀
if len(strs) <= 0: return "" base_str = strs[0] base_str_length = len(base_str) for word in strs: str_length = len(word) if str_length > base_str_length: str_length = base_str_length else: base_str = base_str[:str_length] base_str_length = len(base_str) for i in range(str_length): if word[i] != base_str[i]: base_str = base_str[:i] base_str_length = len(base_str) break return base_str
思路是以第0个元素为基准,假设临时公共前缀为元素0,扫描后面字符串,碰到第几位不同,就把临时公共前缀这位后面的元素去掉,直到所有字符串扫描完,剩下的临时公共前缀就是真正的公共前缀。
比如示例1临时公共前缀的历程为:flower --> flow --> fl
看题解发现别人用了更简便的代码就是zip()函数
if not strs: return '' idx = 0 for tup in zip(*strs): if len(set(tup)) == 1: idx += 1 else: break return strs[0][:idx]
思路是将列表中每个字符串对应位置用元组给列出来,那么zip(*strs)的结果就是[('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g')],第二步将元组使用set去重,如果去重后列表长度为1,说明是公共前缀,若出现去重后列表长度不为1的,则公共前缀就在此结束。