一、学习知识点概要
(一)列表(定义、创建、添加、删除、获取、常用操作符、其他方法)
(二)元组(创建和访问、更新和删除、相关操作符、内置和解压)
二、学习内容
(一)列表
1.列表的定义:
列表是有序集合,没有固定大小,能够保存任意数量任意类型的 Python 对象。
语法为[元素1,元素2,……]。
注意:中括号 逗号
中括号:把所有元素绑在一起;逗号:将每个元素一一分开
2.列表的创建
①创建一个普通列表
x = [1,2, 3, 4, 5, 6, 7,8]
print(x, type(x))
②利用range()创建列表
可以递增也可以递减
x = list(range(1, 11, 2))
print(x, type(x))
# [1, 3, 5, 7, 9] <class 'list'>
x = list(range(10, 1, -2))
print(x, type(x))
# [10, 8, 6, 4, 2] <class 'list'>
③利用推导式创建列表
x = [i for i in range(10, 1, -2)]
print(x, type(x))
④创建一个4x3的二维数组
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]]
print(x, type(x))
注意:
1、由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。即使保存一个简单的[1,2,3],也有3个指针和3个整数对象。
2、[a]*4操作中,只是创建4个指向list的引用,所以一旦a
改变,x
中4个a
也会随之改变。⑤创建混合列表
⑤创建混合列表
mix = [1, 'lsgo', 3.14, [1, 2, 3]]
print(mix, type(mix))
# [1, 'lsgo', 3.14, [1, 2, 3]] <class 'list'>
⑥创建空列表
empty = []
print(empty, type(empty)) # [] <class 'list'>
注意:列表内容是可更改的,因此可以用到append、extend来附加;insert来插入、remove和pop来删除。
3.向列表中添加元素
①list.append(obj)
在列表末尾添加新的对象,只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型。若被增加的元素是一个 list,那么这个 list 将作为一个整体进行追加。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.append('Thursday')
print(x)
②list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.extend(['Thursday', 'Sunday'])
print(x)
注意:【append和extend的区别】
严格来说append是追加,把一个东西整体添加在列表后,而extend是扩展,把一个东西里的所有元素添加在列表后。
③list.insert(index.obj)
在编号index位置插入obj
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.insert(2, 'Sunday')
print(x)
4.删除列表中的元素
①list.remove(obj)
移除列表中某个值的第一个匹配项
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday']
x.remove('Monday')
print(x) # ['Tuesday', 'Wednesday', 'Thursday']
②list.pop([index=-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
y = x.pop()
print(y) # Friday
y = x.pop(0)
print(y) # Monday
注意:【remove和pop的区别】
remove和pop都可以删除元素,前者是指定具体要删除的元素,后者是指定一个索引。
【删除单个或多个对象:】
`del var1[, var2 ……]`
【删除的元素是否再次使用】
如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用方法pop()。
5.获取列表中的元素
通过元素的索引值,从列表获取单个元素(列表索引值是从0开始的)。
让python返回最后一个列表元素则索引指定为-1,返回倒数第二个列表元素则索引指定为-2.
切片的通常写法:start:stop:step
①"start:"
以step 为 1 (默认) 从编号start往列表尾部切片。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(x[3:]) # ['Thursday', 'Friday']
print(x[-3:]) # ['Wednesday', 'Thursday', 'Friday']
②":stop"
以step为 1 (默认) 从列表头部往编号stop切片。
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[:3]) # ['Monday', 'Tuesday', 'Wednesday']
print(week[:-3]) # ['Monday', 'Tuesday']
③"start:stop"
以step为 1 (默认) 从列表头部从编号start往编号stop切片。
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[1:3]) # ['Tuesday', 'Wednesday']
print(week[-3:-1]) # ['Wednesday', 'Thursday']
④"start:stop:step"
以具体的step 从列表头部从编号start往编号stop切片。若step设置为-1,则相当于将列表反向排列。
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[1:4:2]) # ['Tuesday', 'Thursday']
⑤":"
复制列表中的所有元素(浅拷贝)。
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[:])
# ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
【浅拷贝和深拷贝】
6.列表的常用操作符
等号操作符:==
连接操作符 +
重复操作符 *
成员关系操作符 in
、not in
「等号 ==」,只有成员、成员位置都相同时才返回True。
列表拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。
注意:
前面三种方法(append、extend、insert)可对列表增加元素,它们没有返回值,是直接修改了原数据对象。 而将两个list相加,需要创建新的 list 对象,从而需要消耗额外的内存,特别是当 list 较大时,尽量不要使用 “+” 来添加list。
7.列表的其他方法
①list.count(obj):统计某个元素在列表中出现的次数
②list.reverse():反向列表中元素
③list.sort(key=None,reverse=False):对原列表进行排序
(1)key--主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
(2)reverse--排序规则,reverse = True 降序,reverse = False 升序(默认)。
(3)该方法没有返回值,但是会对列表的对象进行排序。
(二)元组
「元组」定义语法为:(元素1,元素2,……)
每个元素都用逗号隔开,小括号将所有元素括起来。
1. 创建和访问一个元组
【元组和列表的区别】
①元组与列表类似,不同之处在于元组被创建后就不能对其进行修改,类似字符串。
②元组使用小括号,列表使用方括号。
③元组与列表类似,也用整数来对它进行索引 (indexing) 和切片 (slicing)。
t1 = (2, 1.1, 'python')
t2 = 2, 1.1, 'python'
print(t1, type(t1))
# (2, 1.1, 'python') <class 'tuple'>
注意:
创建元组可以用小括号 ()或不用,为了可读性,建议还是用 ()。
元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。
2.更新和删除一个元组
元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。
【例子】
t1 = (1, 2, 3, [4, 5, 6])
print(t1) # (1, 2, 3, [4, 5, 6])
t1[3][0] = 9
print(t1) # (1, 2, 3, [9, 5, 6])
3.元组相关的操作符
等号操作符:==
连接操作符 +
重复操作符 *
成员关系操作符 in
、not in
「等号 ==」,只有成员、成员位置都相同时才返回True。
元组拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。
4.内置方法(两种)
①count('python')是记录在元组t中该元素出现几次,显然是 1 次
②index(1.1)是找到该元素在元组t的索引,显然是 1
5.解压元组
解压一维元组、二维元组、只想要元组其中几个元素、不在乎rest变量
三、学习问题与解答(自己遇到的问题+课后题)
【自己遇到的问题】
1.不太理解浅拷贝与深拷贝
【课后题】
一、列表lst 内容如下
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:
- 在列表的末尾增加元素15
- 在列表的中间位置插入元素20
- 将列表[2, 5, 6]合并到lst中
- 移除列表中索引为3的元素
- 翻转列表里的所有元素
- 对列表里的元素进行排序,从小到大一次,从大到小一次
1.
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst.append(15)
2.
lst.insert(5,20)
3.
lst.append([2,5,6])
4.
lst.pop(3)
5.
lst.reverse()
6.从小到大:
lst.reverse或lst.sort
二、修改列表
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍
lst = [1, [4, 6], True]
lst*=2
写了才认识到*是重复符,不会让列表中的数字变成原来的两倍
三、leetcode 852题 山脉数组的峰顶索引
看都看不懂……
四、写出下面代码的执行结果和最终结果的类型
1.
(1,2)*2
#(1, 2, 1, 2)
t2=(1,2)*2
print(type(t2))
#<class 'tuple'>
2.
(1,)*2
#(1, 1)
t3=(1,)*2
print(type(t3))
#<class 'tuple'>
3.
(1)*2
#2
t4=(1)*2
print(type(t4))
#<class 'int'>
五、拆包
四、学习思考与总结
1.列表推导式
x = [i for i in range(10)]
还可以添加上if语句:
x = [i for i in range(10) if i % 2 == 0]
执行顺序:①首先执行列表推导式;②执行if分句;③最后才执行左侧的表达式
更复杂的列表推导式:嵌套
【总结】
①因为这两天事情比较多所以做得很赶,这部分的学习加笔记用时大概在六个小时
②课后题也没有写完,会在明天下午16:30前自己补充完整。
③字符串没有学完 会整理在下次的笔记中。