社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 内置函数之——zip()

小白学视觉 • 3 年前 • 221 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

今天我们来聊一个Python的内置函数——zip()

描述

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。我们可以使用 list() 转换来输出列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 *号操作符,可以将元组解压为列表。我们看一下演示代码。

a = [12345]
b = ['a''b' 'c']
c = ['A''B''C''D''E']
z = zip(a, b, c)
print(list(z))
'''
输出:
[(1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C')]
'''


list_z = [(1'a''A'), (2'b''B'), (3'c''C')]
print(list(zip(*list_z)))
'''
输出;
[(1, 2, 3), ('a', 'b', 'c'), ('A', 'B', 'C')]
'''

在第一段代码中,我们准备了三个列表a,b,c,通过zip()函数将三个列表打包成一个个的元组,然后用list()转换后打印出结果,可以看到输出结果为一个列表,列表中的每个元素均为一个元组。

在第二部分代码中,我们将一个包含三个元组的列表,通过zip(*)函数,解压为列表。

实际应用

首先我们先来看一道算法题目,这是一道来自力扣网站的简单算法题目,链接是:https://leetcode-cn.com/problems/longest-common-prefix/

题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。

示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:



    
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明:所有输入只包含小写字母 a-z 。

初次看到题目,我们很容易写出如下代码

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        result = ""
        if strs == []:
            return result
        strs_len = min(list(map(len, strs)))
        num = 1
        while num <= strs_len:
            if self.string_in(strs[0][0:num], strs):
                result = strs[0][0:num]
            num += 1
        return result

    def string_in(self, s, my_list):
        result = True
        for sub_list in my_list:
            result = (result and (sub_list.startswith(s)))
        return result 

思路很简单,先求出最短的字符串长度,然后从0开始依次比对,如果全部为符合则继续,否则就返回。
我们看一下代码的运行速度

虽然消耗比较低,但是执行速度还是有提升的空间。

下面我们就来看一下如何利用 zip()函数来优化。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        s = ""
        for i in zip(*strs):
            if len(set(i)) == 1:
                s += i[0]
            else:
                break           
        return s 

思路:先利用zip()函数将数组中的元素打包成一个个元组,在通过set方法去重,如果去重后的长度为1,则表示相同公共前缀,否则即不同。
再来看一下这次的运行速度。

执行用时和内存消耗均有提高,可见zip()函数的执行效率。


总结

Python中有很多内置函数,这些函数往往我们都很明白其作用,但找不到运用的场景,这种情况建议大家多做一些基础算法题,可以帮助我们快速理解函数的使用。

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇




下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/137082
 
221 次点击