python3.x zip用法小结

 更新时间:2022年11月15日 11:33:05   作者:bitcarmanlee  
这篇文章主要介绍了python3.x zip用法详解,通过一个简单例子给大家详细讲解zip使用,结合示例代码给大家介绍的非常详细,需要的朋友可以参考下

1.zip用法简介

在python 3.x系列中,zip方法返回的为一个zip object可迭代对象。

class zip(object):
    """
    zip(*iterables) --> zip object
    
    Return a zip object whose .__next__() method returns a tuple where
    the i-th element comes from the i-th iterable argument.  The .__next__()
    method continues until the shortest iterable in the argument sequence
    is exhausted and then it raises StopIteration.
    """

通过上面的注释,不难看出该迭代器的两个关键点:

1.迭代器的next方法返回一个元组,元组的第i个元素为各个输入参数的第i个元素。

2.迭代器的next方法,遇到输入序列中最短的那个序列迭代完毕,则会停止运行。

为了看清楚zip的效果,我们先看个最简单的例子

def fun0():
    a = ['a', 'b', 'c', 'd']
    b = ['1', '2', '3', '4']
    result = zip(a, b)
    print(type(result))
    try:
        while True:
            print(next(result))
    except StopIteration:
        pass

上面的代码,输出结果为

<class 'zip'>
('a', '1')
('b', '2')
('c', '3')
('d', '4')

首先可以看到的是,zip方法返回的,是一个zip对象。

zip对象是个迭代器,用next方法即可对其完成遍历。

当然我们也可以用for循环完成对zip对象的遍历。

def fun00():
    a = ['a', 'b', 'c', 'd']
    b = ['1', '2', '3', '4']
    result = zip(a, b)
    for ele in result:
        print(ele)

('a', '1')
('b', '2')
('c', '3')
('d', '4')

2.参数不等长进行截断

zip方法中,如果传入的参数不等长,则会进行截断,截断的时候会取最短的那个序列,超过最短序列长度的其他序列元素,则会被舍弃掉。

def fun0():
    a = ['a', 'b', 'c', 'd']
    b = ['1', '2', '3', '4', '5', '6']
    result = zip(a, b)
    try:
        while True:
            print(next(result))
    except StopIteration:
        pass

上述的方法如果运行,结果为

('a', '1')
('b', '2')
('c', '3')
('d', '4')

3.python3.x 与2.x中zip的不同

python3.x中,zip方法返回的是一个zip对象,本质是一个迭代器。而在python2.x中,zip方法直接返回一个list。

返回迭代器的好处在于,可以节省list占用的内存,只在有需要的时候再调用相关数据。

4.用zip方法构建字典

zip方法在实际中用途非常广泛,我们下面可以看几个实际中常用的例子。

zip方法可以用来构建字典。

字典包含两部分数据:key列表与value列表。如果我们现在有key序列与value序列,用zip方法可以很快构建一个字典。

def fun5():
    names = ['lili', 'lucy', 'tracy', 'larry']
    scores = [98, 10, 75, 90]
    my_dict = dict(zip(names, scores))
    print(my_dict)

{'lili': 98, 'lucy': 10, 'tracy': 75, 'larry': 90}

5.对多个序列的元素进行排序

排序也是日常工作中的常见需求,对多个序列进行排序而不破坏其元素的相对关系,也非常常见。下面我们来看一个常见的案例

还是以之前的数据为例

有names序列与scores序列,我们希望按照names进行排序,同时保持对应的scores数据。

def fun3():
    names = ['lili', 'lucy', 'tracy', 'larry']
    scores = [98, 10, 75, 90]
    data = sorted(list(zip(names, scores)), key=lambda x: x[0], reverse=False)
    print(data)

输出的结果为

[('larry', 90), ('lili', 98), ('lucy', 10), ('tracy', 75)]

如果我们希望按照分数逆序排,则可以按如下代码运行

def fun3():
    names = ['lili', 'lucy', 'tracy', 'larry']
    scores = [98, 10, 75, 90]
    data = sorted(list(zip(names, scores)), key=lambda x: x[1], reverse=True)
    print(data)

[('lili', 98), ('larry', 90), ('tracy', 75), ('lucy', 10)]

6.对多组数据进行计算

假设我们有3个序列,sales,costs,allowances。其中利润为销售额-成本+补贴,现在我们想求每组利润,就可以使用zip方法。

def fun4():
    sales = [10000, 9500, 9000]
    costs = [9000, 8000, 7000]
    allowances = [200, 100, 150]
    for sale, cost, allowance in zip(sales, costs, allowances):
        profit = sale - cost + allowance
        print(f"profit is: {profit}")

profit is: 1200
profit is: 1600
profit is: 2150

当然我们也可以使用for循环

def fun4():
    sales = [10000, 9500, 9000]
    costs = [9000, 8000, 7000]
    allowances = [200, 100, 150]
    for sale, cost, allowance in zip(sales, costs, allowances):
        profit = sale - cost + allowance
        print(f"profit is: {profit}")
    for i in range(len(sales)):
        profit = sales[i] - costs[i] + allowances[i]
        print(f"profit is: {profit}")

很明显zip方法比for循环还是要更直观,更简洁,更优雅。

7.*操作符进行解压

我们还可以使用*操作符对zip对象进行解压,效果是将zip object还原至原来的对象,效果就类似于压缩以后得解压。

def fun():
    a = ['a', 'b', 'c', 'd']
    b = ['1', '2', '3', '4']
    result = list(zip(a, b))
    print(result)
    zipobj = zip(a, b)
    a1, a2 = zip(*zipobj)
    print(list(a1))
    print(a2)

上面代码运行的结果为

[('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')]
['a', 'b', 'c', 'd']
('1', '2', '3', '4')

到此这篇关于python3.x zip用法详解的文章就介绍到这了,更多相关python3 使用 zip内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python如何获取文件指定行的内容

    Python如何获取文件指定行的内容

    在本篇文章里小编给大家分享的是关于Python获取文件指定行的内容的方法,有需要的朋友们可以学习下。
    2020-05-05
  • python读取测试数据的多种方式

    python读取测试数据的多种方式

    本文主要介绍了python读取测试数据的多种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • python wav模块获取采样率 采样点声道量化位数(实例代码)

    python wav模块获取采样率 采样点声道量化位数(实例代码)

    这篇文章主要介绍了python wav模块获取采样率 采样点声道量化位数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Pycharm开发Django项目创建ORM模型的问题

    Pycharm开发Django项目创建ORM模型的问题

    ORM,全称Object Relational Mapping,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句,下面通过本文给大家介绍Pycharm开发Django项目ORM模型介绍,感兴趣的朋友一起看看吧
    2021-10-10
  • Pytorch 如何实现LSTM时间序列预测

    Pytorch 如何实现LSTM时间序列预测

    本文主要基于Pytorch深度学习框架,实现LSTM神经网络模型,用于时间序列的预测
    2021-05-05
  • plt.title()中文无法显示的问题解决

    plt.title()中文无法显示的问题解决

    本文主要介绍了plt.title()中文无法显示的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • python list转dict示例分享

    python list转dict示例分享

    这篇文章主要介绍了python list转dict的使用方法,大家参考使用吧
    2014-01-01
  • 基于Python实现简单的定时器详解

    基于Python实现简单的定时器详解

    所谓定时器,是指间隔特定时间执行特定任务的机制。几乎所有的编程语言,都有定时器的实现。这篇文章主要介绍的是通过Python实现的定时器,感兴趣的可以跟随小编学习一下
    2021-12-12
  • Python time库的时间时钟处理

    Python time库的时间时钟处理

    这篇文章主要介绍了Python time库的时间时钟处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 详解如何修改jupyter notebook的默认目录和默认浏览器

    详解如何修改jupyter notebook的默认目录和默认浏览器

    这篇文章主要介绍了详解如何修改jupyter notebook的默认目录和默认浏览器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论