当前位置 博文首页 > jcLee95的博客:Python容器专题 - 列表(list)

    jcLee95的博客:Python容器专题 - 列表(list)

    作者:[db:作者] 时间:2021-09-18 15:50

    Python容器专题 - 列表(list)

    导读原文Python容器内容较长不便于阅读和查询,因而被分割称为了多个模块,本文只其中之一。在本文中,详细讲述了Python语言中的列表(list)及其用法。

    博主:李俊才
    CSDN:jcLee95
    邮箱:291148484@163.com

    专题总地址:https://blog.csdn.net/qq_28550263/article/details/111618410


    1. 快速入门列表

    1.1 创建列表

    【eg1-1】创建列表的常见方式汇总

    a = []                            # 创建空列表
    b = [1,2,3,4,5,'6',{7}]           # 创建拥有不同数据类型成员的列表
    c = list((0,1))                   # 通过强制类型转换创建列表
    d = ['零','一','二','三','四','五','六'][1:5]   # 通过列表的切片创建子列表
    e = [i for i in range(1,16,2)]                 # 使用嵌套的表达式建立列表,用到了列表推导式的写法
    f = list(map(lambda x: x, range(1,16,2)))      # 效果上与e相同
    g = [[1,2,3,4,5],[5,4,3,2,1]]                  # 创建二维列表
    print('\na=',a,'\nb=',b,'\nc=',c,'\nd=',d,'\ne=',e,'\nf=',f,'\ng=',g)
    

    Out[]:

    a= [] 
    b= [1, 2, 3, 4, 5, '6', {7}] 
    c= [0, 1] 
    d= ['一', '二', '三', '四'] 
    e= [1, 3, 5, 7, 9, 11, 13, 15] 
    f= [1, 3, 5, 7, 9, 11, 13, 15] 
    g= [[1, 2, 3, 4, 5], [5, 4, 3, 2, 1]]
    

    另外,在创建列表时我们还可以用“list * num”的表达式简写重复的元素,例如:
    【eg1-2】“list * num”的使用

    [1,2] * 2
    

    Out[2]:

    [1, 2, 1, 2]
    

    从结果中我们可以看到,“* 2”这一操作既没有升级为二维列表,也不是得到两个列表,更不是将原列表中所有的元素都X2,而仅仅是把原来列表中的元素原封不动且不改变顺序地插入了一遍。类似地,我们也可以在创建多维列表时使用该方法,如:

    【eg1-3】通过“list * num”创建多维数组

    [[1,2] * 2] * 3
    

    Out[3]:

    [[1, 2, 1, 2], [1, 2, 1, 2], [1, 2, 1, 2]]
    

    这样创建地多列表组看起来好像和普通方法列表一样,特别是使用print()函数输出时,它似乎就是普通列表。但是在对其赋值时却会有让人预料外地结果:

    【eg1-4】

    a = [[1] * 2] * 3
    a[0][1] = 3
    a
    

    Out[4]:

    [[1, 3], [1, 3], [1, 3]]
    

    这与我们所期待的结果[[1, 3], [1, 2], [1, 2]]似乎有那么些不同——由*3创建的所有子数组全部被赋值了而不仅仅是第一个子数组[1,2]赋值成[1,3]。很好!这就是这里要提示的一个知识点。
    发生上述现象的原因在于使用 *对列表执行重复操作并不是创建副本,它只是创建现有对象的引用! *3 创建了对长度为二的同一列表的 3 个引用。 正是如此,对某一行的改变会作用于所有行。
    基于以上的特性,在创建有相同子列表的列表时,先创建一个所需长度的列表,其相同子列表作为元素的部分使用*将显得容易,比如:
    【eg1-5】

    a = [1,2] * 2            # [1,2, 1,2]
    
    for i in range(2):
        a[i] = [1,3] * 2
    a
    

    Out[5]:

    [[1, 3, 1, 3], [1, 3, 1, 3], 1, 2]
    

    1.2 列表索引与切片

    【eg1-6】通过使用“[i]”实现列表的索引:

    a = [1, 2, 3, 4]
    a[-1]
    

    Out[5]:

    4
    

    【eg1-7】通过使用“:”运算符实现列表的切片:

    a = [1, 2, 3, 4]
    a[0:1]
    

    Out[6]:

    [1]
    

    1.3 列表的合并

    【eg1-8】通过使用“+”运算符实现两个列表的合并:

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

    Out[7]:

    [1, 2, 3, 4, 5, 6, 7, 8]
    

    也可以通过list.extend()方法实现两个列表的合并,详见下一节

    1.4 元素存在性

    a = ["老虎","狮子","豹子","袍子","猴子","猩猩","狗熊"]
    "北极熊" in a               # 判断某元素是否在列表a中,结果为 False"猴子" in a                # 结果为 True
    "袍子" not in a             # 结果为 False
    

    1.5 统计列表

    # 列表元素的统计
    a = [i for i in 'ABCDEFGHIJKABCDEFGHIJK']
    a.count('A')                               # 其结果为 2,表明该元素在列表中出现过2次
    

    1.6 反转列表

    # 反转
    a = [1, 2, 3, 4, 5, 6, 7]
    a.reverse()                               # 反转列表元素,[7, 6, 5, 4, 3, 2, 1]
    

    1.7 列表排序

    # 排序
    a = [ 'zl赵六', 'lh李华', 'lm李明', 'xh小红','zs张三', 'lh李华', 'ww王五', 'zl赵六', 'xh小红', 'lh李华']
    print(a.sort())     # 对列表中的元素进行排序
                        # 结果为 [‘lh李华’, ‘lh李华’, ‘lh李华’, ‘lm李明’, ‘ww王五’, ‘xh小红’, ‘xh小红’, ‘zl赵六’, ‘zl赵六’, ‘zs张三’]
                        
    b = [9,7,8,5,2,4,5,4,5]
    b.sort()
    print(b)           # 结果为 [2, 4, 4, 5, 5, 5, 7, 8, 9]
    

    注意:列表的sort()方法本身并不返回值,它会改变原列表元素的顺序。如果仅想返回一个排序后的列表,可以使用sorted()语句,该语句不会改变原列而返回一个新的排序后的列表,如:

    a = [9,7,8,5,2,4,5,4,5]
    print("a=",a)
    sorted(a)
    

    1.8 拷贝列表

    在Python语言中,拷贝可以分为深拷贝浅拷贝,列表(list)自带浅拷贝方法.copy()

    # 获取列表的一个浅拷贝
    a = [0, 1, 2, 3, 4, 3, 2, 1]
    a.copy()
    

    除此之外,你也可以使用Python的标准库copy来实现拷贝,如:

    import copy
    
    a = ["你","好"]
    
    copy.copy(a)        # 返回对象a的浅拷贝
    copy.deepcopy(a)    # 返回对象a的深拷贝
    

    2 列表推导式

    2.1 列表推导式的概念

    列表推导式,又称列表生成式。用来创建(生成)列表的表达式就是列表推导式,它也称为列表生成式。
    本质上列表推导式就是一个简写的for语句。列表推导式中最先出现的与快是后面for语句中遍历时的迭代量的函数,描述了最终返回的列表的每一个元素。每个列表推导式都在for语句后跟一个表达式,然后有若干个for或者if子句。返回结果是一个根据该简写的for语句块生成的列表。

    2.2 通过列表推导式将方法应用于一系列对象

    obj表示某个对象,method()是该对象的一个方法,其使用方法如:

    result = [obj.method() for obj in mylist]
    

    3. 列表的常用方法

    3.1 列表元素的增删改以及索引

    – 增 –

    list.append(x) - 在列表的末尾添加一个元素。
    • 相当于 a[len(a):] = [x] 。

    【eg1-9】使用列表的append()方法在末尾插入新元素

    a = []
    for i in range(19):
        a.append(i)
    a
    

    Out[8]:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
    
    list.insert(i, x) - 在指定的位置插入一个元素。
    • 第一个参数是要插入的元素的索引,所以 a.insert(0, x) 插入列表头部, a.insert(len(a), x) 等同于 a.append(x) 。

    【eg1-10】在某列表a的原第3号位置插入一个新元素

    a = [0, 1, 2, 3, 4]
    a.insert(3, '我是新来的')
    a
    

    Out[9]:

    [0, 1, 2, '我是新来的', 3, 4]
    

    【注意】:使用insert()方法进行插入时,以第一个参数为原先列表的索引值i一定是从0开始计算的。插入元素后,后面的元素先依次往后挪动出一个位置,直至原来在该位置的元素向后挪动出一个空位。最后才把新的元素放在这个唯一的空位上。

    – 删 –

    list.pop([i]) - 删除列表中给定位置的元素并返回它。
    • 如果没有给定位置,a.pop() 将会删除并返回列表中的最后一个元素。
    • 【注意】:方法签名中 i 两边的方括号表示这个参数是可选的,而不是需要你再调用的时候输入方括号,本文之后的类容中出现的所有可选区参数在表示上都将遵循该规则。

    【eg1-11】

    a = [0, 1, 2, 3, 4]
    a.pop()          # pop()函数的返回值是出栈或被删除的元素
    

    Out[10]:

    4
    
    a
    

    Out[11]:

    [0, 1, 2, 3]
    

    【eg1-12】

    a = [0, 1, 2, 3, 4]
    a.pop(2)
    a
    

    Out[12]:

    [0, 1, 3, 4]
    
    list.remove(x) - 移除列表中第一个值为 x 的元素。
    • 如果没有这样的元素,则抛出 ValueError 异常。

    【eg1-13】

    a = [0, 1, 2, 3, 4, 3, 2, 1]
    a.remove(3)
    a
    

    Out[13]:

    [0, 1, 2, 4, 3, 2, 1]
    
    list.clear() - 删除列表中所有的元素。
    • 相当于 del a[:] 。

    【eg1-14】

    a = [0, 1, 2, 3, 4, 3, 2, 1]
    a.clear()
    a
    

    Out[14]:

    [13]
    

    – 改 –

    list.extend(iterable) - 使用可迭代对象中的所有元素来扩展列表。