zoukankan      html  css  js  c++  java
  • python教程(五)·列表与元组

    在介绍了通用的序列操作后,我们来学习序列类型中的列表和元组

    列表

    回顾

    我们已经初步学习了列表,在深入之前,让我们简单回顾一下以往的知识。

    创建列表的方法:

    >>> list_1 = []  # 创建空列表
    >>> list_2 = list()  # 创建空列表
    >>> list_3 = [1,2,3,4]  # 创建带有元素的列表
    >>> list_4 = list('abcd')  # 创建一个列表 ['a','b','c','d']  (这是没学习过的)
    

    给元素赋值:

    >>> x = [1,2,3]
    >>> x[1] = 2  # 将索引为1的元素赋值为2
    >>> x
    [1, 2, 3]
    

    删除元素:

    >>> del x[0]
    >>> x
    [2, 3]
    

    上一节我们还学习了分片、相加、乘法等通用序列操作,这里就不过多阐述

    分片赋值

    在上一节中,我们介绍了通用的序列分片操作。事实上,列表的分片操作并未在此停下脚步。

    对于列表,我们还可以使用分片来批量赋值元素:

    >>> x = list('abcd')
    >>> x
    ['a', 'b', 'c', 'd']
    >>> x[1:3] = list('ef')  # 将索引为1和索引为2的元素分别替换成'e'、'f'
    >>> x
    ['a', 'e', 'f', 'd']
    

    用于替换的序列不必要与原序列等长:

    >>> x = [1,2,3,4,5]
    >>> x[1:3] = ['a', 'b', 'c']  # list_1[1:3]长度为2,但我们替换的序列长度为3
    >>> x
    [1, 'a', 'b', 'c', 4, 5]
    

    如果对分片很熟悉,理解下面这个分片操作应该不会有难度:

    >>> x = [1,2,3]
    >>> x[1:1]
    []
    

    截取索引1到索引1(不包括1)的元素,因为第二个索引的元素是不包括在返回的序列中的,而第一个索引的又是这个不应包括的元素,所以返回了空序列。

    想象一下,list_1[1:1]这个空序列是索引0和索引1之间的“空隙”,那为什么不是1和2之间呢?因为第二个索引1指定的是分片操作的终点,而分片又不包括终点,所以list_1[1:1]当然是终点索引1之前的空隙了。

    说到这里,读者们是否有想到什么清奇的操作呢? (⊙ˍ⊙)

    借助这个看似奇怪的逻辑,我们可以插入一个序列 (°ー°〃)

    >>> x = [1,2,3,4,5]
    >>> x[1:1] = ['a','b','c']
    >>> x
    [1, 'a', 'b', 'c', 2, 3, 4, 5]
    

    对上面的代码,我们可以理解成把一个空序列“替换”成一个新的序列。

    既然可以插入,那么批量删除也是可以的:

    >>> x = [1,2,3,4,5]
    >>> x[1:4] = []
    >>> x
    [1, 5]
    

    列表方法

    append

    append方法用于给列表在末尾追加一个元素:

    >>> x = [1,2,3]
    >>> x.append(4)
    >>> x
    [1, 2, 3, 4]
    
    pop

    pop方法用于移除指定索引(默认为-1,即尾部)的元素,并且返回这个元素:

    >>> x = [1,2,3]
    >>> x.pop()
    3
    >>> x
    [1, 2]
    >>> x.pop(0)  # 移除索引为0的元素
    1
    

    提示:利用append和pop可以实现计算机中十分常见的一种数据结构——栈,栈是一种后进先出(LIFO,Last In First Out)的数据结构,push操作把元素放入栈,像堆叠积木一样,pop操作把顶层的“积木”移除,也就是最后放置的元素最先拿出,把列表当作栈,只需用append方法实现push操作,用pop方法实现pop操作。本系列教程不涉及更深的数据结构的学习,有兴趣的读者可以找找课程学习。

    insert

    insert方法可以把元素插入到指定的索引之前:

    >>> x = [1,2,3]
    >>> x.insert(1, 'a')
    >>> x
    [1, 'a', 2, 3]
    

    使用分片赋值也是可以的:

    >>> x = [1,2,3]
    >>> x[1:1] = []
    >>> x[1:1] = ['a']
    >>> x
    [1, 'a', 2, 3]
    

    不过比起insert方法,分片赋值的方式可读性比较差

    remove

    remove方法用于移除列表中某个元素的第一个匹配项:

    >>> x = [1,2,3,2,1,3]
    >>> x.remove(2)
    >>> x
    [1, 3, 2, 1, 3]
    >>> x.remove(5)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: list.remove(x): x not in list
    

    相信大家也看到,如果元素不存在,程序将抛出错误

    index

    index方法用于返回某个元素的第一个匹配项的索引:

    >>> x = [1,2,3,2,1,3]
    >>> x.index(3)
    2
    

    同样的,如果元素不存在,则抛出错误:

    >>> x.index(5)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: 5 is not in list
    

    count

    count方法用于数数,数什么数?数元素出现的次数:

    >>> x = [1,2,3,2,2,1]
    >>> x = [1,2,[2],2,[1,2],2]
    >>> x.count(2)
    3
    >>> x.count([1,2])
    1
    >>> x.count(11)
    0
    
    extend

    extend方法用于附加一个序列至列表末尾:

    >>> a = [1,2,3]
    >>> b = [4,5,6]
    >>> a.extend(b)
    >>> a
    [1, 2, 3, 4, 5, 6]
    

    这个操作类似于序列相加操作:

    >>> a = [1,2,3]
    >>> b = [4,5,6]
    >>> a = a + b
    >>> a
    [1, 2, 3, 4, 5, 6]
    

    但是使用extend方法效率比较高

    我们还可以使用分片赋值的方式来实现与extend相同的效果:

    >>> a = [1,2,3]
    >>> b = [4,5,6]
    >>> a[len(a):] = b
    >>> a
    [1, 2, 3, 4, 5, 6]
    

    但这比起extend,可读性变差了,所以还是使用extend方法比较好

    reverse

    reverse方法用于翻转列表:

    >>> x = [1,2,3,4,5]
    >>> x.reverse()
    >>> x
    [5, 4, 3, 2, 1]
    

    如果仅仅想得到翻转后的列表,而不修改原列表,可以使用反向索引的分片来实现:

    >>> x = [1,2,3,4,5]
    >>> x[::-1]
    [5, 4, 3, 2, 1]
    

    如果需要反向迭代列表,还可以使用reversed函数创建一个反向迭代列表的迭代器:

    >>> x = [1,2,3,4,5]
    >>> for i in reversed(x):
    ...     print(i)
    ... 
    5
    4
    3
    2
    1
    >>> list(reversed(x))  # 还可以使用list函数来将迭代器转换成列表
    [5, 4, 3, 2, 1]
    
    sort

    sort方法用于对列表进行排序。

    >>> x = [3,2,4,8,6]
    >>> x.sort()
    >>> x
    [2, 3, 4, 6, 8]
    

    要注意的是这个方法是对原列表进行修改的,如果不想修改原列表而获取排序结果,可以使用sorted函数:

    >>> x = [3,2,4,8,6]
    >>> sorted(x)
    [2, 3, 4, 6, 8]
    

    sort方法还可以自定义排序的方式,比如把10排在1之前,把'a'排在3之前等等,在python2中只需提供一个参数,这个参数是一个比较函数,但是python3取消了这个参数,需要使用其它方式来自定义排序的方式,这里就不深入了解了,读者们可以去python官网查看文档学习。


    元组

    元组的基本操作和列表一样,但是元组是不可修改的,所以没有append、remove等修改序列的方法,只有count和index方法。

    基本操作如下:

    创建元组:

    >>> tuple_1 = () # 空元组
    >>> tuple_2 = tuple()  # 空元组
    >>> tuple_3 = 1,2,3
    >>> tuple_4 = (1,2,3,4)
    

    索引元素:

    >>> x = (1,2,3,4)
    >>> x[1]
    2
    

    count、index方法:

    >>> x = (1,2,2,3,4,5,3,2)
    >>> x.count(2)
    3
    >>> x.index(3)
    3
    

    还有分片、相加等通用序列操作,上节已介绍,这里不过多阐述

    元组的意义在于:

    1. 元组可以作为字典等映射类型的,而列表不可以,因为键必须是不可变的,元组刚好就是不可变类型,而列表是可变类型。
    2. 函数返回多个值的时候,其实就是返回了一个元组,我们必须对元组进行处理。

    好了,本节到此结束,下期再见!

    ヾ( ̄▽ ̄)Bye~Bye~

  • 相关阅读:
    leetcode680
    leetcode558
    leetcode840
    leetcode703
    leetcode836
    leetcode704
    leetcode849
    leetcode707
    2019-10-26-Inno-Setup-安装包脚本-Run-的-Flags-标记
    2019-8-30-C#-从零开始写-SharpDx-应用-笔刷
  • 原文地址:https://www.cnblogs.com/featherl/p/10424783.html
Copyright © 2011-2022 走看看