zoukankan      html  css  js  c++  java
  • Python 极简教程(七)列表 list

    由于列表过于重要,请认真看完并保证所有代码都敲过一遍。

    什么是列表

    列表是 Python 中最常用的数据结构,也是一种数据类型,其样式如下:

    li = [1, 2, 3, 'a', 'b']
    

    列表是一种序列。Python 中的序列有 列表 list元组 tuple字符串 str

    百度百科关于序列的解释:
    数学上,序列是被排成一列的对象(或事件);这样每个元素不是在其他元素之前,就是在其他元素之后。这里,元素之间的顺序非常重要。

    列表是一种有序、可变的存储结构。列表中的元素可以是任意的数据类型,数量也没有限制。简单来说,列表主要用来存取数据的。比如我们从数据库或者 excel 文件中读取数据后,需要临时存储在内存中,就会使用列表。

    列表操作

    1. 创建列表

    列表使用方括号,方括号内以逗号分隔各个元素。

    >>> li = []  # 创建空列表
    >>> li1 = [1,2,3,'a','b']   # 对元素的数据类型没有要求,任意组合
    >>> li2 = [1,2,3,['a', 'b']]   # 甚至元素本身也可以是一个列表(构成多维列表)
    

    2. 列表取值

    列表取值涉及到索引的概念,列表中每个元素都有一个索引,索引的计数从 0 开始,如列表 li = [7, 8, 9,10,11],索引如下:
    列表索引
    Python 中,列表的索引有正向索引(从0开始)和负向的索引(从-1开始)。上图中的 0 和 -5 代表同一个索引位置。
    那么列表取值就需要用到索引:

    >>> li = [7, 8, 9,10,11]
    >>> li[0]  # 取第一个
    7
    >>> li[-5]  # 取倒数第5个,也就是第一个
    7
    >>> li[-1]   # 取最后一个
    11
    >>> li[5]  #取第5个,但是我们现在只有4个,所以报超出索引的错误
    IndexError: list index out of range
    

    如果有多维列表的话,要子列表中的元素的话,需要根据维度多次取值:

    >>> li = [1,2,3,['a', 'b']]   # 'b' 元素在 li 列表的子列表中
    >>> li[3][1]  # 先取出子列表,再取子列表中的第二个元素
    'b'
    # 上面的语句拆解一下
    >>> sli = li[3]  # 先取子列表,子列表是 li 列表的第四个元素
    >>> sli
    ['a', 'b']
    >>> sli[1]  # 再从子列表中取第二个元素
    'b'
    

    注意,我们在操作列表的时候一定要注意列表的长度,否则就会出现超出索引的错误。要确定列表的最大长度,我们可以使用 len()函数。后面讲列表相关函数时一并讲解。

    3. 列表改值

    列表通过索引取值,也可以通过索引改值。

    >>> li[0] = 77  # 修改第一个元素的值,从 7 改为 77
    >>> li  # 修改后要重新查看一下列表的值才能看到变化
    [77, 8, 9, 10, 11]
    >>> li[-2] = 110  # 也可以使用负向索引改值
    >>> li
    [77, 8, 9, 110, 11]
    

    4. 列表运算

    除了上面的列表取值和改值,我们也可以进行一些其他的运算。
    列表相加

    >>> [1, 2, 3] + [5, 7]  # 两个列表相加,组合生成一个新列表
    [1, 2, 3, 5, 7]
    

    列表乘法

    >>> [1, 2] * 3
    [1, 2, 1, 2, 1, 2]
    

    成员运算

    >>> li = [1,2,3,['a', 'b']]
    >>> 3 in li  # 元素 3 是否在列表 li 中
    True
    >>> 'a' in li  # 元素 'a' 在 li 的子列表中,不在 li 中
    False
    >>> ['a', 'b'] in li
    True
    

    列表常用函数

    函数 说明
    len 取列表长度,也就是列表中元素的个数
    max 取列表中的最大值,要注意列表中的元素必须是能够进行比较运算的数据类型
    min 取列表中的最小值,注意事项同 max
    sorted 对列表排序,并返回一个排好序的新列表,注意事项同 max
    # len() 函数
    >>> li = [1,2,3,['a', 'b']]
    >>> len(li)  # 调用 len 函数,将列表变量 li 作为 len 函数的参数传入
    4
    
    # max() 函数
    >>> max(li)    # li 中有整型和列表两种数据类型,这两种数据类型不能进行比较运算
    TypeError: '>' not supported between instances of 'list' and 'int'
    >>> li1 = [3,4,8,2,5]
    >>> max(li1)  # 其实从上面的报错信息可以看出来,max 和 min 函数是通过比较大小后,输出一个最大/最小的值
    8
    
    # min() 函数
    >>> min(li1)
    2
    
    # sorted() 函数
    >>> sorted(li1)
    [2, 3, 4, 5, 8]
    >>> sorted(li)  # sorted 函数也不允许对不同的数据类型排序,因为它也用的是比较运算
    TypeError: '<' not supported between instances of 'list' and 'int'
    

    不同的数据类型之间排序是没有意义,不用继续玩下去了 ─━ _ ─━✧(能看出是斜视么)

    列表常用内置方法

    这里提到了函数和方法,函数是 Python 内置的一些预设常用的函数,可以针对多种数据类型和情况进行处理。而列表的内置方法呢,只能针对列表本身,也就是把列表作为一个对象去操作了。
    关于函数和方法的概念,后面会详细讲解。

    方法 说明
    append(obj) 在列表末尾添加新的元素,最常用的方法
    count(obj) 统计某个元素出现的次数
    extend(seq) 在列表末尾追加另一个列表(或其他序列类型)
    index(obj) 从列表中找到一个匹配元素的索引位置,注意只能匹配第一个
    insert(index, obj) 在指定的索引位置插入元素
    pop(index) 删除指定索引位置的元素,如果不传值则表示删除最后一个元素
    remove(obj) 删除指定的元素;如果有多个同样的元素,删除第一个
    reverse() 将列表中的元素按照索引反向排列(不是反向排序,只是按照现有的顺序反过来而已)
    sort() 对原列表进行排序。注意是原列表,上面讲的 sorted() 函数是返回一个排序后的新列表
    copy() 将列表拷贝生成一个新的列表
    clear() 清空列表

    1. append(obj) 添加元素

    在列表末尾添加新的元素,此方法是列表方法中最常用的方法。务必记住。

    >>> li = [1,2,3]
    >>> li.append('a')    # 改变的是原列表,所以没有返回值
    >>> li    # 要看改动结果,需要查看原列表
    [1, 2, 3, 'a']
    >>> li.append(['x','y'])    # 把一个列表作为元素添加到 li 列表末尾
    >>> li      # 生成一个二维的列表
    [1, 2, 3, 'a', ['x', 'y']]
    

    2. count(obj) 统计元素个数

    在括号中输入要统计的元素,conut 方法返回该元素出现的次数。

    >>> li = [1,2,3,2,5]
    >>> li.count(2)
    2
    

    3. extend(seq) 追加列表(序列)

    extend 方法用于将另外的序列(列表、元组或字符串)中的所有元素,追加到原列表中。与列表相加生成新列表不同,extend 改变的是原列表。

    >>> li = [1,2,3]
    >>> li2 = ['x', 'y']
    >>> li.extend(li2)
    >>> li
    [1, 2, 3, 'x', 'y']      # 将 li2 中的所有元素全部追加到 li
    

    4. index(obj) 查找元素

    从列表中找到一个匹配元素的索引位置,注意只能匹配第一个,如果有多个那么也只能找到第一个。不要问我如果有多个怎么办,也许你该试试先去重

    >>> li = ['x', 'y', 'z', 'x']
    >>> li.index('x')
    0    # 返回索引位置
    

    5. insert(index, obj) 插入元素

    在第一个参数指定的索引位置插入元素。

    >>> li = ['x', 'y', 'z', 'x']
    # 我插入一个 'a' 到 'y' 和 'z' 之间。相当于在 'z' 所在的索引位置插入 'a'
    >>> i = li.index('z')   # 找到 z 所在的索引 
    >>> li.insert(i, 'a')    # 也可以写在一起 li.insert(li.index('z'), 'a')
    >>> li
    ['x', 'y', 'a', 'z', 'x']
    

    insert 方法在列表元素较多的情况下不建议使用,因为一旦通过 insert 插入数据,列表后半部分的元素索引都会发生变化(比如上例中的 'z' 和 'x' 索引都会加 1),造成不必要的运算。
    所以一般除非有必要否则都是使用 append 来添加元素。

    6. pop(index)根据索引删除元素

    pop 方法根据索引删除元素,也就是说删除需要删除的元素索引。
    如果不指定则默认删除最后一个,这也是消耗最小的一种做法。因为删除中间位置的元素,那么也会造成后半部分元素索引的变化,会造成不必要的性能损耗。

    >>> li = ['x', 'y', 'a', 'z', 'x']
    >>> li.pop(2)
    'a'    # 返回被删除的元素
    >>> li
    ['x', 'y', 'z', 'x']
    

    7. remove(obj)删除指定的元素

    pop 方法根据索引删除元素,如果是默认删最后一个,删除效率是最高的。而 remove 方法是指定元素删除,如果有重复的元素,则只会删除第一个。

    >>> li = ['x', 'y', 'a', 'z', 'x']
    >>> li.remove('x')      # 你自己知道你删的是啥,所以不再需要返回删除的内容了
    >>> li
    ['y', 'a', 'z', 'x']  # 有两个 'x', 只删除第一个
    

    8. reverse() 反向

    将列表中的元素按照索引反向排列。

    >>> li = [7, 11, 5, 3, 8]
    >>> li.reverse()
    >>> li
    [8, 3, 5, 11, 7] 
    

    9. sort() 列表排序

    对原列表进行排序。注意是原列表,上面讲的 sorted() 函数是返回一个排序后的新列表。

    >>> li = [7, 11, 5, 3, 8]
    >>> sorted(li)
    [3, 5, 7, 8, 11]    # 输出的是新的列表
    >>> li
    [7, 11, 5, 3, 8]    # 原列表没有发生变化
    >>> li.sort()
    >>> li
    [3, 5, 7, 8, 11]   # 改变的是原来的列表
    >>> lis = ['x', 'X', 'a', '5']  # 还可以对字符串排序,字符串排序是按照 ASCII 排序
    # ASCII 的顺序是“数字 < 大写字母 < 小写字母”
    >>> lis.sort()
    >>> lis
    ['5', 'X', 'a', 'x']
    
    # sort 还有一个参数 reverse,用于指定升序还是降序。默认值为 False 表示升序
    # 如果要使用降序,则修改该参数值为 True
    >>> li = [7, 11, 5, 3, 8]
    >>> li.sort(reverse=True)  # 设置降序,升序不需要传 reverse 的值
    >>> li
    [11, 8, 7, 5, 3]
    

    注意,排序时,必须全部是数值类型或者字符串类型,不能混合,否则会报错。

    10. copy() 拷贝列表

    需要给变量赋值一个列表,可以采用直接赋值的方式。但是直接赋值代表两个变量指向同一个列表的地址,而列表又是可变的,导致一个变量变化,另一个变量也会变化。

    >>> l1 = [7, 11, 5, 3, 8]      # 列表 l1
    >>> l2 = l1      # l1 赋值给 l2
    >>> l1
    [7, 11, 5, 3, 8]
    >>> l2
    [7, 11, 5, 3, 8]
    >>> l1[1] = 1  # 修改 l1 的值,将第二个元素 11 改为 1
    >>> l1
    [7, 1, 5, 3, 8]
    >>> l2      # l2 的值也会跟着变化
    [7, 1, 5, 3, 8]
    

    那么想复制一个列表,并且是独立的,那么需要使用 copy 方法。

    >>> l1 = [7, 11, 5, 3, 8]
    >>> l2 = l1.copy()    # 复制
    >>> l1
    [7, 11, 5, 3, 8]
    >>> l2
    [7, 11, 5, 3, 8]
    >>> l1[0] = 77    # 修改 l1 的值
    >>> l1
    [77, 11, 5, 3, 8]
    >>> l2    # l2 并没有发生变化
    [7, 11, 5, 3, 8]
    

    当然这里只是所谓的浅复制,关于浅复制和深复制这个概念了,在面试的时候经常到,后面专门写一篇文章来说明。

    11. clear() | 清空列表

    这个简单,就是清空。

    >>> li = [7, 11, 5, 3, 8]
    >>> li.clear()
    >>> li
    []
    

    本节练习
    写代码,有如下列表,按照要求实现每一个功能(每小题都使用最原始的列表)
    li = ['nemo', 'nano', 'tato', 'leo', 'monkey']

    计算列表长度并输出
    列表中追加元素 "seven",并输出添加后的列表
    请在列表的第 1 个位置插入元素 "Tony",并输出添加后的列表
    请修改列表第 2 个位置的元素为 "Kelly",并输出修改后的列表
    请删除列表中的元素 "nano",并输出修改后的列表
    请删除列表中的第 2 个元素,并输出删除的元素的值和删除元素后的列表
    请删除列表中的第 3 个元素,并输出删除元素后的列表
    请将列表所有的元素反转,并输出反转后的列表
    找到 "leo" 元素并将其修改为 "lee"
    
  • 相关阅读:
    php学习推荐
    python 安装numpy报错
    PHP最基础
    php自定义错误函数
    phpMyAdmin安装
    php链接mysql提示:Call to undefined function mysql_connect()
    POJ 1005 解题报告
    亚马逊在线笔试(2014/10/9)
    LeetCode 题目 word break 思路剖析与改进
    Dijkstra单源最短路算法的C++实现
  • 原文地址:https://www.cnblogs.com/zmll/p/10611069.html
Copyright © 2011-2022 走看看