四大容器 - 列表

列表

一.什么是列表 ?

  1. 列表的定义:列表是容器型数据类型,将[ ]作为容器的标志,里面多个元素用逗号隔开

  2. 列表的特性:

    • 什么都能存的大仓库:什么数据类型都可以放进去
    • 可变的:列表中元素的个数和值是可以改变的,支持增删改
    • 有序性:每个元素有其位置信息,支持下标索引操作
list = [ ]
print(list[0])
# 注意,只打一个空格,其不属于任何数据类型,只是一个格式缩进,和空列表是一样的
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

Input In [2], in <cell line: 2>()
      1 list = [ ]
----> 2 print(list[0])


IndexError: list index out of range
# 关于 Nan和 None的区别:
# Nan多为计算无结果,返回到数表里的值
# None为python中表示空的符号

二.列表的增删改查

1. 增加元素

  1. list.append(元素) :将该元素添加到列表最后

  2. list.insert(插入元素的位置,要插入的元素): 将该元素放到指定位置,然后将该位置原来的元素及其后面的元素往后排(易错)

  3. list.extend(list) : 将另一个列表黏贴到原列表后面

  4. 利用数学运算符+、或 * :

    • list = list1+list2
    • list*N–>列表中的元素重复N遍,然后产生一个新的列表

2.删除元素

  1. del list(下标): 删除该元素

  2. list.remove(元素的值) :删除第一个等于该元素值的元素,注意是第一个

  3. list.pop(下标) :取出该元素,注意pop有返回值,上面两种都没有返回值

  4. list.clear() :清空列表

特殊情况处理:遍历列表+删除 的跳过情况
  1. 概述:当遍历时,你删除或者插入元素,遍历对象list改变,而for循环还是按照之前的下标依次增加。是以,存在这两方面问题。

  2. 处理方法(例子见错题一):

    1. 备份一个相同的列表,遍历新列表,list.remove()原列表
    2. 建立一个新列表,把符合条件的加入新列表;有时会和in联用 —>这个是最好用的,不删除而添加
    3. 反着删除

3.修改元素

list[下标] = 值

4.查找元素

  1. 获取单个元素:列表[下标]

    • 下标怎么用?:
      1. 列表中每个元素有两种下标索引方式共存:正向索引和负向索引
      2. 正向索引从0开始,负向索引从-1(最后一个元素)开始
  2. 获取多个元素:切片列表[开始下标:结束下标:步长]

    • 开始下标和结束下标
      1. 方向:开始下标和结束下标会构成一个方向。
      2. 下标正负:开始下标和结束下标可以是正数(正向索引),也可以为负数(负向索引),也可以混合使用(同样会构成一个方向)
      3. 重点:下标从0开始,且,最后一个值不取(特指结束下标所指的那一个元素取不到)
    • 步长
      1. 正负:表方向,正数,代表从前往后,负数,代表从后往前。下标构成的方向与步长方向需要保持一致,否则就会返回空列表
      2. 大小:步长为1时,正常挨个取,步长为2时,是跳一个取一个,往后数到的第二个元素
    • 特殊的切片快捷操作:
      1. 省略:
        • 省略步长,默认步长是1;
        • 省略开始/结束下标,全取;
        • 三个位置都可省,或两两省略,或全省
      2. list[::]:列表拷贝赋值
      3. list[::-1]:翻转列表
  3. 使用遍历获取元素

    • 列表遍历取数有三种方法:
      1. 直接遍历
      2. 间接遍历
      3. for 变量1,变量2 in enumerate(list):
        循环体
        #依次输出所有元素的下标和索引
heroes = ['王昭君', '孙斌', '李白', '百里守约', '墨子', '澜', '孙悟空', '诸葛亮', '李信', '妲己']
print(heroes[-1:1:2])
#[]
print(heroes[2:7:-2])
#[]
print(heroes[8:1:3])
#[]
print(heroes[6:0:-2])
#['孙悟空','墨子','李白']
print(heroes[-1:1:-1])
#['妲己','李信','诸葛亮','孙悟空','澜','墨子','百里守约','李白']
print(heroes[0:7:3])
#['王昭君','百里守约','孙悟空']
[]
[]
[]
['孙悟空', '墨子', '李白']
['妲己', '李信', '诸葛亮', '孙悟空', '澜', '墨子', '百里守约', '李白']
['王昭君', '百里守约', '孙悟空']

5. 使用运算符对列表进行操作

  1. +、*:

    • list = list1+list2 、和字符串一样,也可以直接粘贴
    • list * N :将列表内元素重复N遍,然后形成一个新的列表
  2. in:成员运算符

3.>和 <:列表比较大小
+ 比较第一对不相等的元素大小(其他有序容器都是这么比的)

三、列表的BIF

-------------通用函数,有序列的都可以用,如range,字符串--------------------

1. sum(列表):要求列表中的元素必须都是数字
2. max(列表)、min(列表):获取列表中的最大值,要求列表中的元素支持比较运算
3.sorted(列表):对原列表无修改,生成一个新的从小到大排序好的列表,有返回值。
  • reverse:sorted(列表,reverse=True) 翻转,将列表从大到小排列
4.len(列表):返回列表的长度,元素的个数
5.list(列表):对象只能是可迭代对象。将指定序列一个个转化为列表,将序列中的元素转化为列表中的元素

-------------列表的方法:方法是面向对象的概念,这里的方法只能对列表用-----------------

1. list.clear():清空列表
2. list.copy():浅拷贝原列表,返回一个新列表。
+ copy是浅拷贝,也会新开一个数据源,只不过不复制子列表的数值
+ 相同功能的用法:list[:]、list*1、list+[]
3. list.count(元素):返回指定元素出现的次数
4.list.index(元素):返回第一个指定元素的下标,注意是第一个;如果数据不存在会报错
5. list.reverse( ): 列表倒序翻转
6. list.sort(reverse=False/True):将原列表,默认从小到大排序,没有返回值

四、列表推导式

  1. [表达式 for 变量 in 容器]

  2. [表达式 for 变量 in 容器 if 条件]

五、 列表的拷贝(课外拓展)

  1. python中变量拷贝和可变容器(如列表)拷贝不同

    • 变量拷贝,直接:b = a
    • 列表拷贝,list1 = list1[:]、list*1,list+[ ]
    • 正常变量赋值不用考虑,但列表拷贝必须使用浅拷贝
    • 原理:正常拷贝赋值都是赋值的地址,变量拷贝,你要是修改,就会产生新的空间储存数据,和原来无牵扯。 而列表拷贝不能使用正常的赋值操作来赋值,因为里面容器可变,修改会直接修改原数据源。
  2. 深拷贝和浅拷贝有哪些不同

    • 两者相同点:
      • 都会复制一份一个新的数据源
    • 不同点:
      • 列表中如果有子列表,两者的复制出来的的数据不一样
      • 解释:浅拷贝,对于子列表的位置,会只拷贝地址,指向原来的子列表。深拷贝,对于列表中的子列表,会直接再复制一份数据。
  3. 拓展:

    • 内存有两种(不止这两块):栈区间和堆区间

      • 栈区间:所有变量名(即数据所在的地址,指针)都在栈区间
      • 堆区间:所有数据都在堆区间
    • 拷贝方式有两种:深拷贝和浅拷贝

      • 浅拷贝:在栈里,给变量名copy一份地址,指向原来的数据存储地方。
      • 深拷贝:在堆里,建立一个新的数据空间,和之前的数据大小一样,然后再搞一个新的变量名指向它。 list[:],list*1,list+[]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值