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的,则公共前缀就在此结束。

posted @ 2022-02-08 14:33  o云淡风轻o  阅读(493)  评论(0编辑  收藏  举报