python 基础二 list 的基本操作

列表

列表(list)作为 Python 中最常用的数据类型之一,是一个可增加、删除元素的可变(mutable)容器。

基本操作

1 创建 [ ]:

创建 list 的方法非常简单,只使用一对中括号 []。如下创建三个list:

empty = []
lst = [1,'xiaoming',29.5,'17312662388']
lst2 = ['001','2019-11-11',['三文鱼','电烤箱']]

2 计算长度 len :

使用 Python 的内置函数 len 求 list 内元素个数:

len(empty) # 0
len(lst) # 4
len(lst2) # 3

3 遍历 for :

依次遍历 lst 内每个元素并求对应类型,使用 for in 对遍历,内置函数 type 得到类型:

for _ in lst:
    print(f'{_}的类型为{type(_)}')

打印结果如下,列表 lst 内元素类型有 3 种:

1的类型为<class ‘int’>
xiaoming的类型为<class ‘str’>
29.5的类型为<class ‘float’>
17312662388的类型为<class ‘str’>

因此 !Python 的列表不要求元素类型一致

4 尾部添加数据 append :

如何向 lst2 的第三个元素 [‘三文鱼’,‘电烤箱’] 内再增加一个元素 ‘烤鸭’
首先,使用“整数索引”取出这个元素:

sku = lst2[2] # sku 又是一个列表

然后,使用列表的 append 方法增加元素,append 默认增加到 sku列表尾部:

sku.append('烤鸭')
print(sku) # ['三文鱼', '电烤箱', '烤鸭']

4 指定位置添加数据 insert :

此时想在 sku 指定索引 1 处插入“牛腱子”,使用列表的 insert 方法:

sku.insert(1,'牛腱子')
print(sku) # ['三文鱼', '牛腱子', '电烤箱', '烤鸭']

5 移除尾部元素 pop :

在购买烤鸭和牛腱子后,发现超出双十一的预算,不得不放弃购买烤鸭,使用 pop 方法可直接移除列表尾部元素:

item = sku.pop() # 返回烤鸭
print(sku) # ['三文鱼', '牛腱子', '电烤箱']

6 移除指定位置元素 remove :

发现还是超出预算,干脆移除三文鱼,pop 因为只能移除表尾元素,幸好列表有 remove 方法:

sku.remove('三文鱼') # 更好用:sku.remove(sku[0])
print(sku) # ['牛腱子', '电烤箱']
深浅拷贝

7 浅拷贝 copy :

打印 lst2,发现第三个元素也对应改变,因为 sku 引用 lst2 的第三个元素,sku 指向的内存区域改变,所以 lst2 也会相应改变。

print(lst2) # ['001', '2019-11-11', ['牛腱子', '电烤箱']]

如果不想改变 lst2 的第三个元素,就需要复制出 lst2 的这个元素,列表上有 copy 方法可实现复制:

lst2 = ['001','2019-11-11',['三文鱼','电烤箱']] # 这是lst2的初始值
sku_deep = lst2[2].copy()  # 注意,copy 函数,仅仅实现对内嵌对象的一层拷贝,属于 shallow copy。

此时,再对 sku_deep 操作,便不会影响 lst2[2] 的值。
如下修改 sku_deep 的第一个元素(Python 的列表索引从 0 开始编号),lst2 未受到任何影响。

sku_deep[0] = '腱子'
print(lst2[2]) # ['三文鱼','电烤箱']

修改 sku_deep 时,不会影响 lst2[2]。

8 深拷贝 deepcopy:

请看下面例子,a 是内嵌一层 list 的列表,对其浅拷贝生成列表 ac,修改 ac 的第三个元素,也就是列表 [3,4,5] 中的第二个元素为 40:

a = [1,2,[3,4,5]]
ac = a.copy()
ac[0] = 10
ac[2][1] = 40

修改后,分别测试两个值的相等性。

print(a[0] == ac[0])

返回 False,证明实现拷贝。

而 ac[2][1] 是否与原数组 a 的对应位置元素相等:

print(a[2][1] == ac[2][1])

返回 True,进一步证明是浅拷贝,不是深拷贝。

PS: 非常简单啦, [3,4,5] 并不在a中, 在a 中的是[3,4,5]的内存地址,所以copy的时候只是复制了[3,4,5]的内存地址,但是地址指向的东西并没有发生任何改变。

要想实现深度拷贝,需要使用 copy 模块的 deepcopy 函数:

from copy import deepcopy

a = [1,2,[3,4,5]]
ac = deepcopy(a)
ac[0] = 10
ac[2][1] = 40
print(a[0] == ac[0])
print(a[2][1] == ac[2][1])

打印结果,都为 False,内嵌的 list 全部完成复制,都指向了不同的内存区域。

切片

9 切片 [ : : ] :

Java 和 C++ 中,访问数组中的元素只能一次一个,但 Python 增加切片功能为访问列表带来极大便利。利用内置函数 range(start,stop,step) 生成序列数据,并转为 list 类型:

a = [1, 4, 7, 10, 13, 16, 19]

使用 a[:3] 获取列表 a 的前三个元素,形象称这类操作为“切片”,切片本身也是一个列表 [1,4,7]:


    使用 a[-1] 获取 a 的最后一个元素,返回 int 型,值为 19;
    使用 a[:-1] 获取除最后一个元素的切片 [1, 4, 7, 10, 13, 16];
    使用 a[1:5] 生成索引为 [1,5)(不包括索引 5)的切片 [4, 7, 10, 13];
    使用 a[1:5:2] 生成索引 [1,5) 但步长为 2 的切片 [4,10];
    使用 a[::3] 生成索引 [0,len(a)) 步长为 3 的切片 [1,10,19];
    使用 a[::-3] 生成逆向索引 [len(a),0) 步长为 3 的切片 [19,10,1]。

逆向:从列表最后一个元素访问到第一个元素的方向

特别地,使用列表的逆向切片操作,只需一行代码就能逆向列表:

def reverse(lst):
    return lst[::-1]

调用reverse函数:

ra = reverse(a)
print(ra) # [19, 16, 13, 10, 7, 4, 1]

想要了解更高级的切片操作 矩阵切片 移步我的文章

总结:

  1. 列表的基本操作
  2. 重要深、浅拷贝问题
  3. 常见的切片操作

附录

本篇是一篇学习笔记 摘录自:GitChat专栏《Python全栈60天精通之路》加上自己的一些见解 ,专栏图文并茂更加详细 。
侵权删

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专治跌倒扭伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值