一、列表的基本使用
1.列表的格式
定义列的格式:[元素1,元素2,元素3,...,元素n]
变量tmp的类型为列表
tmp = ['XiaoChen',180,66.0]
列表中的元素可以是不同类型的
2.使用下标获取列表元素
namesList = ['XiaoChen','XiaoHuang','XiaoLiu']
print(namesList[0]) # XiaoChen
print(namesList[1]) # XiaoHuang
print(namesList[2]) # XiaoLiu
二、列表的增删改查
1.添加元素
添加元素有以下几个方法:
- append末尾添加元素
- insert指定位置插入元素
- extend合并两个列表
#append会把新元素添加到列表末尾
#定义变量A,默认有三个元素
A = ['XiaoChen','XiaoHuang','XianLiu']
print('--添加之前,列表A的数据--A=%s' % A)
#提示、并添加元素
temp = input('请输入要添加的学生姓名:')
A.append(temp)
print('--添加之后,列表A的数据--=%s' % A)
#insert(index,object)在指定位置index前插入元素object
strs = ['a','b','m','s']
strs.insert(2,'c')
print(strs)#['a','b','c','m','s']
#通过extend可以将另一个集合中的元素逐一添加到列表中
a = ['a','b','c']
b = ['d','e','f']
a.extend(b)
print(a) # ['a','b','c','d','e','f']将b添加到a里
print(b) # ['d','e','f'] b的内容不变
2.修改元素
通过指定下标来访问列表元素,因此修改元素的时候,为指定的列表下标赋值即可。
#定义变量A,默认有三个元素
A = ['XiaoChen','XiaoHuang','XianLiu']
print('--添加之前,列表A的数据--A=%s' % A)
#修改元素
A[1] = 'XiaoZhang'
print('--添加之后,列表A的数据--=%s' % A) # ['XiaoChen', 'XiaoZhang', 'XianLiu']
3.查找元素
查看指定的元素是否存在,以及查看元素所在的位置,主要有以下几个方法:
- in 和 not in
- index 和 count
#in(存在),如果存在那么结果为true,否则为false
#not in(不存在),如果不存在那么结果为true,否则false
# 待查找的列表
nameList = ['XiaoChen','XiaoHuang','XianLiu']
#获取要查找的名字
findName = input('请输入要查找的名字:')
#查找是否存在
if findName in nameList:
print('找到了相同名字')
else:
print('没有找到')
说明:in的方法只要会用了,那么not in也是同样的用法,只不过not in判断的是不存在
index用来查找元素所在的位置,如果未找到则会报错;
count用来计算某个元素出现的次数。它们的使用和字符串里的使用效果一致。
a = ['a','b','c','d','a','b']
# print(a.index('a',1,3)) # 注意是左闭右开区间
# 报错 ValueError: 'a' is not in list
print(a.index('a',1,5)) # 4
print(a.count('b')) # 2
print(a.count('f')) # 0
4.删除元素
列表元素的常用删除方法有:
- del:根据下标进行删除
- pop:删除最后一个元素
- remove:根据元素的值进行删除
#del
movieName = ['加勒比海盗','泰坦尼克号','冰雪奇缘','变形金刚','杀死比尔']
print('删除之前:' ,movieName)
del movieName[2]
print('删除之后:',movieName)
#运行结果
# 删除之前: ['加勒比海盗', '泰坦尼克号', '冰雪奇缘', '变形金刚', '杀死比尔']
# 删除之后: ['加勒比海盗', '泰坦尼克号', '变形金刚', '杀死比尔']
#pop
movieName = ['加勒比海盗','泰坦尼克号','冰雪奇缘','变形金刚','杀死比尔']
print('删除之前:' ,movieName)
movieName.pop()
print('删除之后:',movieName)
#运行结果
# 删除之前: ['加勒比海盗', '泰坦尼克号', '冰雪奇缘', '变形金刚', '杀死比尔']
# 删除之后: ['加勒比海盗', '泰坦尼克号', '冰雪奇缘', '变形金刚']
#remove
movieName = ['加勒比海盗','泰坦尼克号','冰雪奇缘','变形金刚','杀死比尔']
print('删除之前:' ,movieName)
movieName.remove('加勒比海盗')
print('删除之后:',movieName)
#运行结果
# 删除之前: ['加勒比海盗', '泰坦尼克号', '冰雪奇缘', '变形金刚', '杀死比尔']
# 删除之后: ['泰坦尼克号', '冰雪奇缘', '变形金刚', '杀死比尔']
5.排序(sort,reverse)
sort方法是将list按特定顺序重新排列,默认为由小到大,参数reverse=True可改为倒序,由大到小。
reverse方法是将list逆置
a = [1, 4, 2, 3]
a.reverse() # 逆置,不排序
print(a) # [3, 2, 4, 1]
a.sort() # 默认从小到大排序
print(a) # [1, 2, 3, 4]
a.sort(reverse=True) # 从大到小排序
print(a) #[4, 3, 2, 1]
练习:请删除列表words = ['hello','','','good','hi','','yes','','no']里所有的空字符串。
利用while循环遍历列表,设置从0开始遍历,
# 如果存在空字符串,则删除空字符串,同时令i-1,实现全部遍历
words = ['hello','','','good','hi','','yes','','no']
i = 0
while i < len(words):
if words[i] == '':
words.remove(words[i])
i -= 1
i += 1
print(words)
三、列表的遍历
1.使用while循环
nameList = ['xiaoWang','xiaoChen','xiaoHuang']
length = len(nameList) # 获取列表长度
i = 0
while i < length:
print(nameList[i])
i += 1
#输出结果
# xiaoWang
# xiaoChen
# xiaoHuang
2.使用for循环
nameList = ['xiaoWang','xiaoChen','xiaoHuang']
for name in nameList:
print(name)
#输出结果
#xiaoWang
#xiaoChen
#xiaoHuang
3.交换2个变量的值
#使用中间变量
a = 4
b = 5
c = 0
c = a
a = b
b = c
print(a) # 5
print(b) # 4
4.练习
手动实现冒泡排序(难)
nums = [5,1,7,6,8,2,9,3]
for j in range(0,len(nums) -1):
for i in range(0,len(nums) - 1 -j):
if nums[i] > nums[i + 1]:
a = nums[i]
nums[i] = nums[i+1]
nums[i+1] = a
print(nums)
有一个列表names,保存了一组姓名
names=['zhangsan','lisi','chris','jerry','henry']
,再让用户输入一个姓名,如果这个姓名在列表里存在,提示用户姓名已存在;如果这个姓名在列表里不存在,就将这个姓名添加到列表里。
#方法一
names = ['zhangsan','lisi','chris','jerry','henry']
username = input('请输入一个姓名:')
if username in names:
print('用户名已经存在')
else:
names.append(username)
print(names)
#方法二
for name in names:
if username == name:
print('用户名已经存在')
break
else:
names.append(username)
print(names)
四、列表的嵌套
1.列表嵌套
类似while循环的嵌套,列表也是支持嵌套的
一个列表中的元素又是一个列表,那么这就是列表的嵌套
此处重点掌握怎么操作被嵌套的列表
schoolNames = [
[1,2,3],
[11,22,33],
[111,222,333]
]
print(schoolNames[1][2]) # 33
a = schoolNames[1][2] = 'abc' # 把33修改为'abc'
print(schoolNames) # [[1, 2, 3], [11, 22, 'abc'], [111, 222, 333]]
print(schoolNames[1][2][2])#获取'abc'里的字符c
操作嵌套列表,只要把要操作元素的下标当作变量名来使用即可。
2.应用
一个学校,有3个办公室,现在有8位老师等待工位的分配,请编写程序,完成随机的分配
import random
#定义一个列表用来保存3个办公室
offices = [[],[],[]]
#定义一个列表用来存储8位老师的名字
names = ['A','B','C','D','E','F','G','H']
i = 0
for name in names:
index = random.randint(0,2)
offices[index].append(name)
i = 1
for tempNames in offices:
print('办公室%d的人数为:%d'%(i,len(tempNames)))
i += 1
for name in tempNames:
print('%s'%name,end='')
print("\n")
print("-"*20)
运行结果:
五、列表的推导式
所谓列表推导式,就是指的轻量级循环创建列表
1.基本的方式
a = [x for x in range(4)]
print(a) # [0, 1, 2, 3]
b = [x for x in range(3,4)]
print(b) # [3]
c = [x for x in range(3,10)]
print(c) # [3, 4, 5, 6, 7, 8, 9]
d = [x for x in range(3,19,2)]
print(d) # [3, 5, 7, 9, 11, 13, 15, 17]
2.在循环的过程中使用if
a = [x for x in range(3,10) if x%2==0]
print(a) # [4, 6, 8]
b = [x for x in range(3,10) if x%2!=0]
print(b) # [3, 5, 7, 9]
c = [x for x in range(3,10)]
print(c) # [3, 4, 5, 6, 7, 8, 9]
3.2个for循环
a = [(x,y) for x in range(1,3) for y in range(3)]
print(a) # [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
4.3个for循环
a = [(x,y,x) for x in range(1,3) for y in range(3) for z in range(4,6)]
print(a)
#输出结果
#[(1, 0, 1), (1, 0, 1), (1, 1, 1), (1, 1, 1), (1, 2, 1),
# (1, 2, 1), (2, 0, 2), (2, 0, 2), (2, 1, 2), (2, 1, 2), (2, 2, 2), (2, 2, 2)]
4.4练习
请写出一段python代码实现分组一个list里面的元素,比如[1,2,3,... 100]变成[[1,2,3],[4,5,6]...]
a = [x for x in range(1,101)]
b = [a[x:x+3] for x in range(0,len(a),3)]
print(a)
print(b)
六、列表的复制
a = 12
b = a
b = 13
print(b) # 13
print(a) # 12
nums1 = [1,5,8,9,10,12]
nums2 = nums1
print(nums2) # [100, 5, 8, 9, 10, 12]
print(nums1) # [100, 5, 8, 9, 10, 12]
1.为什么修改了nums2里的数据,nums1的数据也会改变?
Python中的赋值运算都是引用(即内存地址)的传递。对于可变类型来说,修改原数据的值,会改变赋值对象的值。
2.怎样nums1和nums2变成两个相互独立不受影响的列表?
使用列表的copy方法,或者copy模块就可以赋值一个列表。
1.列表的copy方法
使用列表的copy方法,可以直接将原来的列表进行复制,变成一个新的列表,这种复制方式是浅复制。
nums1 = [1,5,8,9,10,12]
nums2 = nums1.copy() # 调用列表的copy方法,可以复制出一个新的列表
nums2[0] = 100
# 修改新列表里的数据,不会影响到原有列表里的数据
print(nums2) # [100, 5, 8, 9, 10, 12]
print(nums1) # [1, 5, 8, 9, 10, 12]
2.copy模块的使用
除了使用列表的copy方法以外,python还提供了copy模块来复制一个对象。copy模块提供了浅复制和深复制两种方式,它们的使用方式相同,但是执行的效果有一定的差异。
2.1 浅拷贝
浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。
import copy
words1 = ['hello','good',['yes','ok'],'bad']
#浅拷贝只会拷贝最外层的对象,里面的数据不会拷贝,而是直接指向
words2 = copy.copy(words1)
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello','good',['no','ok'],'bad]
#words2里的yes被修改成了no
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']
2.2 深拷贝
深拷贝是对于一个对象所有层次的递归拷贝。
import copy
words1 = ['hello','good',['yes','ok'],'bad']
#深拷贝会将对象里的所有数据都进行拷贝
words2 = copy.deepcopy(words1)
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello', 'good', ['yes', 'ok'], 'bad']
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']
2.3 切片
列表和字符串一样,也支持切片,切片其实就是一种浅拷贝。
words1 = ['hello','good',['yes','ok'],'bad']
words2 = words1[:]
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello', 'good', ['no', 'ok'], 'bad']
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']