day4-课程内容-列表【类似数组】
一、创建列表
1、创建普通列表
>>> stu = ['小王','小张','小李','小赵']
>>> stu
['小王', '小张', '小李', '小赵']
2、创建混合列表
>>> mix = ['小王','小张',3.14,[1,2,3]]
>>> mix
['小王', '小张', 3.14, [1, 2, 3]]
3、创建空列表
>>> kong = []
>>> kong
[]
二、向列表添加元素
1、append()
语法
列表.append('要添加的元素')
例如
>>> stu.append('小刘') #在对象里面我们把属于对象的函数称之为方法,append方法属于stu列表对象的方法
>>> stu #所以用‘.’作用域来进行限制
['小王', '小张', '小李', '小赵', '小刘']
注意点:append()只可以一次性添加一个元素
2、extend()
语法
列表.extend([要添加的列表])
例如
>>> stu.extend(['小玉','小田'])
>>> stu
['小王', '小张', '小李', '小赵', '小刘', '小玉', '小田']
3、insert()
语法
列表.insert(要插入的下标,'要插入列表的元素')
例如
>>> stu.insert(1,'小一')
>>> stu
['小王', '小一', '小张', '小李', '小赵', '小刘', '小玉', '小田']
二、对列表中的元素进行操作
1、从列表获取元素
跟数组一样,可以通过元素的索引值(index)从列表获取单个元素
注意:列表索引值是从0开始的
例如
>>> stu = ['小王','小张','小李','小赵']
>>> stu[2]
'小李'
2、对列表内的元素进行交换
>>> temp = stu[2]
>>> stu[2] = stu[3]
>>> stu[3] = temp
>>> stu[2]
'小赵'
>>> stu[3]
'小李'
3、从列表删除元素
remove()
语法
列表.remove('要移除的元素')
例如
>>> stu.remove('小李')
>>> stu
['小王', '小张', '小赵']
注意点:若被操作删除的元素未在列表内,会报错
del #不是一个列表的方法,是一个语句
语法
del 列表名[元素下标]
例如
>>> del stu[1]
>>> stu
['小王', '小赵']
pop() #返回被剔除的元素同时将ta剔除
语法
列表名.pop(对应元素的下标,如不填则默认最后一位元素)
例如
#给他元素下标,下标即索引值
>>> stu
['小王', '小张', '小赵']
>>> stu.pop(1)
'小张'
>>> stu
['小王', '小赵']
#不给下标,下标即索引值
>>> stu
['小王', '小赵']
>>> stu.pop()
'小赵'
>>> stu
['小王']
4、列表分片 #slice
含义
利用列表分片,将新建一个列表,并可以一次性获取原列表内需要的多个元素,可以理解为:生成原列表的副本,即复制
语法
>>> stu
['小王', '小张', '小李', '小赵']
>>> stu[0:2] #默认不带最后一位
['小王', '小张']
>>> stu
['小王', '小张', '小李', '小赵']
>>> stu[:3] #前面可不给下标,即从第一个元素开始
['小王', '小张', '小李']
>>> stu[1:] #后面可不给下标,即到最后一个元素结束
['小张', '小李', '小赵']
>>> stu[] #中间必须有':'冒号,不然会报错
SyntaxError: invalid syntax
>>> stu[:] #若前后都不给下标,则会对原列表进行一个拷贝
['小王', '小张', '小李', '小赵']
三、列表的一些常用操作符
1、比较操作符
>>> list1 = [123]
>>> list2 = [456]
>>> list1 > list2
False
>>> list1 = [123,456]
>>> list2 = [234,123]
>>> list1 > list2 #只比较第0个元素的大小
False
2、逻辑操作符
>>> list3 = [123,456]
>>> (list1 < list2) and (list1 == list3)
True
3、连接操作符
>>> list4 = list1 + list2 #不要用'+'号,使用正常的append或extend进行列表元素添加
>>> list4
[123, 456, 234, 123]
>>> list1 + '小' #不可以直接添加元素,可以使用append或者extend进行元素的添加
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
list1 + '小'
TypeError: can only concatenate list (not "str") to list
4、重复操作符
>>> list4 * 3 #'*'用在列表中,即对列表中的元素可进行复制
[123, 456, 234, 123, 123, 456, 234, 123, 123, 456, 234, 123]
5、成员关系操作符【in 和 not in】
>>> 123 in list1
True
>>> 2134 in list2
False
>>> 2134 not in list2
True
# 只可判断一层关系
>>> list5 = [123,['小张','小李']]
>>> '小张' in list5
False
# 如何对列表中的列表中的元素进行查询或返回
>>> list5[1][1]
'小李'
四、列表类型的内置函数【BIF】
1、count(要查询的元素)
计算元素在列表中出现的次数
>>> list4
[123, 456, 234, 123]
>>> list4.count(123)
2
2、index(要查询的元素)
返回参数在列表中的位置
>>> list4.index(123)
0
# index(要查找的参数,范围的起始位置,范围的终止位置)
>>> list4.index(123,3,5)
3
3、reverse()
将列表中的元素进行翻转
>>> list4.reverse()
>>> list4
[123, 234, 456, 123]
4、sort()
指定方式对列表元素进行排序,默认无参数,为从小到大排序
>>> list6 = [2,4,6,3,1,7]
>>> list6
[2, 4, 6, 3, 1, 7]
>>> list6.sort()
>>> list6
[1, 2, 3, 4, 6, 7]
# sort(func指定排序的算法,key跟算法搭配的关键字默认使用的归并排序,reverse默认=FULSE可改为TRUE)
>>> list6.sort(reverse=True)
>>> list6
[7, 6, 4, 3, 2, 1]
五、列表分片的补充
>>> list6
[7, 6, 4, 3, 2, 1]
>>> list7 = list6[:]
>>> list7
[7, 6, 4, 3, 2, 1]
>>> list8 = list6
>>> list8
[7, 6, 4, 3, 2, 1]
>>> list6.sort()
>>> list6
[1, 2, 3, 4, 6, 7]
>>> list7 #通过分片即列表拷贝的新列表不受原列表的影响,属于一个新增的独立列表
[7, 6, 4, 3, 2, 1]
>>> list8 #仅仅通过赋值的新列表,会受到原列表更改的影响,并非独立列表,只是添加了一个指向原列表的新的标签
[1, 2, 3, 4, 6, 7]
day4作业
测试题:
- 列表都可以存放一些什么东西?
自答:任何数据类型 - 向列表增加元素有哪些方法?
自答:append、insert、extend - append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别?
自答:append直接添加元素,extend用列表扩充列表 - member.append([‘竹林小溪’, ‘Crazy迷恋’]) 和 member.extend([‘竹林小溪’, ‘Crazy迷恋’]) 实现的效果一样吗?
自答:不一样。前者的是将[‘竹林小溪’, ‘Crazy迷恋’]作为元素添加进去,后者是添加’竹林小溪’, 'Crazy迷恋’两个元素到member列表 - 有列表 name = [‘F’, ‘i’, ‘h’, ‘C’],如果小甲鱼想要在元素 ‘i’ 和 ‘h’ 之间插入元素 ‘s’,应该使用什么方法来插入?
自答:name.insert(2,‘s’) - 下边的列表分片操作会打印什么内容?
>>> list1 = [1, 3, 2, 9, 7, 8]
>>> list1[2:5]
自答:
list1 = [2,9,7]
-
请问 list1[0] 和 list1[0:1] 一样吗?
自答:一样
参考答案:不一样,list1[0] 返回第0个元素的值,list1[0:1] 返回一个只含有第0个元素的列表。
前者是根据元素的索引值进行的查找,后者是对原列表进行的分片 -
如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做?
自答:reverse
参考答案:
>>> list1.insert(0, list1.pop())
-
有些鱼油比较调皮,他说我想试试 list1[-3:-1] 会不会报错,怎么知道一试居然显示 [9, 7],这是怎么回事呢?
自答:从后往前取,取从倒数第3位到倒数第2位的元素 -
在进行分片的时候,我们知道分片的开始和结束位置需要进行指定,但其实还有另外一个隐藏的设置:步长。
在普通的分片操作中,步长默认设置为1,表示逐个遍历元素。其实我们可以人为调整步长以达到不可告人的秘密。
>>> list1[0:6:2]
[1, 2, 7]
那么依你推测,关于步长的知识点还有哪些(很多知识点都是通用的)?
自答:for循环或while循环中取值
- 课堂上小甲鱼说可以利用分片完成列表的拷贝 list2 = list1[:],那事实上可不可以直接写成 list2 = list1 更加简洁呢?
自答:不可以,list2 = list1只是简单的将list2指向了list1并未真正生成新列表的拷贝 - 注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案。
>>> old = [1, 2, 3, 4, 5]
>>> new = old
>>> old = [6]
>>> print(new)
如果不上机操作,你觉得会打印什么内容?
自答:[1,2,3,4,5]?
参考答案:一样
- 请问如何将下边这个列表的’小甲鱼’修改为’小鱿鱼’?
list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
自答:
del list1[1,[2]]
insert.list1(1,‘小鱿鱼’)
参考答案:
list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
list1[1][2][0] = '小鱿鱼'
#对列表中的元素进行修改,即对ta进行重新赋值
- 要对一个列表进行顺序排序,请问使用什么方法?
自答:列表名.sort()
参考答案:
>>> 列表名.sort()
- 要对一个列表进行逆序排序,请问使用什么方法?
自答:列表名.reverse()
参考答案:
>>> 列表名.reverse()
>>> 列表名.sort(reverse=True)
- 列表还有两个内置方法没给大家介绍,不过聪明的你应该可以自己摸索使用的门道吧:copy() 和 clear()
自答:
参考答案:
copy() 方法跟使用切片拷贝是一样的:
>>> list2 = list1.copy()
>>> list2
[1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
clear() 方法用于清空列表的元素,但要注意,清空完后列表仍然还在哦,只是变成一个空列表。
>>> list2.clear()
>>> list2
[]
- 你有听说过列表推导式或列表解析吗?明日学习下推导式和列表解析
没听过?!没关系,我们现场来学习一下吧,看表达式:
>>> [ i*i for i in range(10) ]
你觉得会打印什么内容?
>>> [i*i for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
居然分别打印了0到9各个数的平方,然后还放在列表里边了有木有?!
列表推导式(List comprehensions)也叫列表解析,灵感取自函数式编程语言 Haskell。Ta 是一个非常有用和灵活的工具,可以用来动态的创建列表,语法如:
[有关A的表达式 for A in B]
例如
>>> list1 = [x**2 for x in range(10)]
>>> list1
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
相当于
list1 = []
for x in range(10):
list1.append(x**2)
问题:请先在 IDLE 中获得下边列表的结果,并按照上方例子把列表推导式还原出来。
>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2
>==0 if y%2!=0]
自答:[ (x+2 for x in range(0,9,2)),(y+2 for y in range(1,10,2))] #好吧,,理解错了
还原就是还原为最原始的for循环表达式,如果是以列表推导式展示出来,才是写对应的列表推导式
参考答案:
list1 = []
for x in range(10):
for y in range(10):
if x%2 == 0:
if y%2 != 0:
list1.append((x, y))
- 活学活用:请使用列表推导式补充被小甲鱼不小心涂掉的部分
自答:
list3 =['[list2[3],':',list1[0]]',n\,'[list2[1],':',list1[1]]',n\,'[list2[2],':',list1[2]]',n\,'[list2[3],':',list1[3]]']
参考答案:
list1 = ['1.just do it','2.一切皆有可能','3.让编程改变世界','4.Impossible is Nothin']
list2 = ['4.阿迪达斯','2.李宁','3.鱼','1.耐克']
#正常形式(列表推导式还原)
for x in list1:
for y in list2:
if x[0] == y[0]:
print(y,':',x[2:]) #为何要做切片,因为将list1的元素循环打印出来后为'1.just do it'等,需要将元素从.前面切掉才为需要的
#列表推导式
list3 = [(y+':'+x[2:]) for x in list1 for y in list2 if x[0] == y[0]]
# 1、为何要使用(y+':'+x[2:])的'+'号,因为需要对字符串进行拼接输出,如果使用','号,则只是将三个需要输出的元素分隔开,无法拼接输出
# 2、为何x[0] == y[0]要加上[]和索引值,因为如果单纯的是x == y则计算机会自动比较每次输出的元素是否相等,而不是比较元素的索引值
动动手:
- 自己动手试试看,并分析在这种情况下,向列表添加数据应当采用哪种方法比较好?
假设给定以下列表:
member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳']
要求将列表修改为:
member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
方法一:使用 insert() 和 append() 方法修改列表。
方法二:重新创建一个同名字的列表覆盖。
自答:
方法一
member = ['小甲鱼','黑夜','迷途','怡静','秋舞斜阳']
x = ['88','90','85','90','88']
n = 0
for i in range(1,10,2):
member.insert(i,x[n])
n +=1
print(i)
#如果想指定打印列表中的哪个元素,可以用以下的写法
print(member[i],member[i+1])
方法二
member = ['小甲鱼','黑夜','迷途','怡静','秋舞斜阳']
temp = member[:]
member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
- 利用 for 循环打印上边 member 列表中的每个内容,如图:
自答:
member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
for i in member:
print(i)
- 上一题打印的样式不是很好,能不能修改一下代码打印成下图的样式呢?【请至少使用两种方法实现】
自答:
方法一
member = ['小甲鱼','黑夜','迷途','怡静','秋舞斜阳']
x = ['88','90','85','90','88']
n = 0
for i in range(1,10,2):
member.insert(i,x[n])
n +=1
print(member[i],member[i+1])
方法二
member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
x = 0
length = len(member)
while count < length:
print(member[x],member[x+1])
count +=2