python中的zip()与zip(*)函数用法

最近用到了python中的zip函数,在菜鸟教程中查看了相关函数的使用方法,但是对zip(*)一直不明白怎么运行的,今天突然想到了不定量参数传递给函数的问题,似乎对zip(*)有了一些新的理解。

首先是对不定量参数*args**kwargs传参进行简单的说明:
*args:用来发送一个非键值对的可变数量的参数列表给一个函数
**kwargs:是将不定长的键值对作为参数传递给一个函数
相关的例子有很多,而且也很简单,这里不再赘述,总结一句话就是:***都有打包和解包的作用,在定义函数的时候使用,是打包的意思,在调用函数的时候则是解包的作用。如:

def f(*args):  # 可以接受任意长度的参数,把所有参数打包后给args
	print(args)  # 这里的args则是打包后的元组

调用函数时:

def func(a,b,c):
	xxxxxx
li = [1,2,3]
func(*li)  # 这是*就起到了解包的作用,*li则是把列表解压成一个个参数
func(*li)       <==>     func(1,2,3)

当然**则是对键值对参数进行打包解包,原理一样,就不作说明了,有兴趣的可以问度娘。

下面是对zip函数的使用,在菜鸟教程中可以查看相关使用方法,这里直接摘抄了,哈哈!
描述
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。

我们可以使用 list() 转换来输出列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表

注意:zip 方法在 Python 2 和 Python 3 中的不同:在 Python 2.x zip() 返回的是一个列表。

zip 语法:

zip([iterable, ...])

参数说明:

  • iterable – 一个或多个迭代器;

返回值

返回一个对象

起初对:利用 * 号操作符,可以将元组解压为列表一直不理解,今天有所明白:
举个例子:

a = [1, 2, 3]
b = ["a", "b", "c"]
zip(a, b)  # 返回的是一个对象
list(zip(a, b))  # 输出为:[(1, 'a'), (2, 'b'), (3, 'c')]

那么zip(*iterable)有什么作用呢,肯定是跟zip()作用相反的
举个例子:

ll = ["flower", "flow", "flqwe"]
zip(*ll)   返回的结果是什么呢?

如果单独记忆“利用 * 号操作符,可以将元组解压为列表”,估计很难说出答案,其实使用打包解包的思想,就很容易明白了:
1、*xx 在调用函数的时候是解包作用,因此:*ll ==> "flower", "flow", "flqwe"
2、 zip(*ll) ==> zip("flower", "flow", "flqwe")这跟zip(a, b)没什么两样
是不是很简单,以前一直没想通,又可以少记一个内置函数了!
最后解一道可以用zip()方法解题的LeetCode算法题:

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”

示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。

说明:
所有输入只包含小写字母 a-z 。
解题思路:先使用zip(*li)对字符串数组进行元素打包,然后使用set()函数去重,如果去重后的元素长度为1,则是公共前缀。

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        s = ""
        for i in list(zip(*strs)):
            ss = set(i)
            if len(ss) == 1:
                s += ss.pop()
            else:
                break  # 只要有一个不是一就跳出
        return s

猜你喜欢

转载自blog.csdn.net/weixin_41599977/article/details/89386629