目录
一、列表的创建
二、列表的访问
1.索引
2.切片
三、对于列表的有关操作(增、删、改、查)
1.在列表中添加元素
2.删除list中的元素
3.修改列表中的值
4.列表的有关查询操作
四、列表的排序
1.sorted函数
2.sort方法
五、列表的嵌套
六、列表的高级应用
1.多维列表排序
2.列表推导式
3.构造多维列表
七、练习
八、第十课练习答案
列表是可变的序列(列表中可以存储多个数据,且可以对其中的数据进行新增、删除、修改和查询),列表是常用来存储同类项目的集合。
animals = ['bear','tiger','zebra','elephant'] #这是一个列表,可以将它理解为容器
1.names_of_students = [] # 创建一个空列表
2.name of department = ['信息工程学院'] # 包含1个元素
3.names_of_majors = ['软件技术','物联网应用技术','计算机网络技术'] # 以逗号分割项目,包含3个元素
4.words = [x for x in 'abc'] # 使用列表推导式将可迭代对象转为列表
5.numbers = list('123456789') # 使用类型构造函数将可迭代对象转为列表,
要访问列表中的值有索引和切片两种方式。(是不是感觉有些熟悉?是的,之前的字符串也是如此。)
如何获得animals中的tiger?
列表中根据每个元素所在的下标取值就是索引。类似字符串,下标不是从1开始,而是从0开始。如果你想要2,那你的大脑中就应该想到第2位的下标是1。
>>>print(animals[1])
tiger
>>>for index in range(len(animals)):
... print(animals[index])
bear
tiger
zebra
elephant
>>>names_of_majors = ['软件技术','物联网应用技术','计算机网络技术']
>>>names_of_majors[1:3]
['物联网应用技术', '计算机网络技术']
>>>numbers = [1,2,3,4,5,6,7,8,9,0]
>>>print(numbers[2:4]) # 从索引2到4(不包含4)之间的值
[3, 4]
>>>print(numbers[5:]) # 从索引5到结束
[6, 7, 8, 9, 0]
>>>print(numbers[-2:]) # 从右侧倒数第二开始到结束
[9, 0]
>>>print(numbers[0:9:3]) # 从索引0到9(不包含9),每隔3个元素取1个值
[1,4,7]
(1)append方法
append将元素追加到最后,每次添加一个元素,格式为s.append(x),x可以是任意数值类型。
>>>animals = ['bear','tiger','zebra','elephant']
>>>animals.append('crocodile')
>>>animals
['bear', 'tiger', 'zebra', 'elephant', 'crocodile']
还有一点需要注意的是,在python的官方文档中提到s.append('x')等同于s[len(s):len(s)]=['x'],而s[len(s)]=['x']则会出现错误提示“list assignment index out of range”。这是因为索引方法只对已有下标有效,而s[len(s):len(s)]=['x']使用的是切片方法,可以突破已有下标的限制。
(2)insert方法
insert将元素插入到指定位置,格式为s.insert(i,x),i为插入位置的下标,x可以是任意数值类型。s.insert(i,x)等同于s[i:i]=x。
插入数值
>>>s=[1,2,3,4,5]
>>>s.insert(0,0)
>>>s
[0, 1, 2, 3, 4, 5]
插入列表
>>>s=[1,2,3,4,5]
>>>s.insert(3,[1,2])
>>>s
[1, 2, 3, [1, 2], 4, 5]
插入字典
>>>s=[1,2,3,4,5]
>>>s.insert(3,{'a':3})
>>>s
[1, 2, 3, {'a': 3}, 4, 5]
插入元组
>>>s=[1,2,3,4,5]
>>>s.insert(3,(0,0,0))
>>>s
[1, 2, 3, (0, 0, 0), 4, 5]
(3)extend方法
作用是实现两个列表的连接,格式为list1.extend(list2),等效于list1+=list2或者list1[len(list1):len(list1)]=list2。
#
>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s.extend(t)
>>>s
[1, 2, 3, 4, 5, 4, 5, 6]
>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s+=t
>>>s
[1, 2, 3, 4, 5, 4, 5, 6]
>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s[len(s):len(s)]=t
>>>s
[1, 2, 3, 4, 5, 4, 5, 6]
>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s.extend(t[-2:])
>>>s
[1, 2, 3, 4, 5, 5, 6]
(1)del函数
>>>s=[1, 2, 3, 4, 5, 5, 6]
>>>del s[0] # 删除指定索引的值
>>>s
[2, 3, 4, 5, 5, 6]
>>>del s[:2] # 删除切片区域内的值
>>>s
[4, 5, 5, 6]
>>>del s[:] # 删除全部的值
>>>s
[]
(2)clean方法
删除list中的所有元素,等同于del s[:]。
>>>words=['a','b','c','d']
>>>words
['a', 'b', 'c', 'd']
>>>words.clear()
>>>words
[]
(3)remove方法
根据值删除列表中与其相同的第一个元素。
>>>words=['a','b','c','b','d']
>>>print(words)
['a','b','c','b','d']
>>>words.remove('b')
>>>print(words)
['a','c','b','d']
(4)pop方法
根据索引删除列表中的元素,同时返回删除的元素。格式为s.pop(i),i是索引值,缺省时默认为-1,即删除列表中的最后一个值。
>>>numbers = [1,2,3,4,5,6]
>>>number1 = numbers.pop()
>>>print(number1)
6
>>>print(numbers)
[1, 2, 3, 4, 5]
>>>number2 = numbers.pop(1)
>>>print(number2)
2
>>>print(numbers)
[1, 3, 4, 5]
思考:如何删除列表中所有的'b'。
(1)利用索引和切片修改列表中的值
>>>odd_numbers = [1,3,5,'aa',9]
>>>odd_numbers[3] = 7 # 修改单个值
>>>odd_numbers
[1, 3, 5, 7, 9]
>>>odd_numbers[0:3] = [2,2,2] # 修改多个值,切片长度和替换值的数量相等,原有列表长度不变
>>>odd_numbers
[2, 2, 2, 7, 9]
>>>odd_numbers[0:2] = [3,3,3] # 修改多个值,切片长度小于替换值的数量,原有列表长度变大
>>>odd_numbers
[3, 3, 3, 2, 'aa', 9]
>>>odd_numbers[0:3] = [1,2,3,4] # 修改多个值,切片长度小于替换值的数量,原有列表长度再次变大
>>>odd_numbers
[1, 2, 3, 4, 2, 'aa', 9]
>>>odd_numbers[::2] = ['bb','cc','dd','ee'] # 根据步长修改列表中的元素
>>>odd_numbers
['bb', 2, 'cc', 4, 'dd', 'aa', 'ee']
>>>odd_numbers[0:4] = ['aa'] # 修改多个值,切片长度大于替换值的数量,原有列表长度变小
>>>odd_numbers
['aa', 'dd', 'aa', 'ee']
(2)列用for循环和索引修改列表中的值
将['aa', 'dd', 'aa', 'ee']中的'aa'修改为'cc'
>>>odd_numbers = ['aa', 'dd', 'aa', 'ee']
>>>for i in range(len(odd_numbers)):
... if odd_numbers[i] == 'aa':
... odd_numbers[i] = 'cc'
...
>>>print(odd_numbers)
['cc', 'dd', 'cc', 'ee']
# 是否包含某个元素?
>>>odd_numbers = ['cc', 'dd', 'cc', 'ee']
>>>if 'cc' in odd_numbers:
... print(True)
True
# 列表中有几个'cc'
>>>odd_numbers.count('cc')
2
>>>odd_numbers.count('aa')
0
# 返回列表中某个元素的索引值
>>>odd_numbers.index('cc')
0
odd_numbers.index('aa') # 如果列表中不包含这个元素,则出现异常
Traceback (most recent call last):
File "", line 1, in
ValueError: 'aa' is not in list
# 获取列表的长度
>>>len(odd_numbers)
4
# 查找列表中的最大值
>>>max(odd_numbers)
'ee'
# 查找列表中的最小值
>>>min(odd_numbers)
'cc'
sorted是python的内建函数,可以对所有可迭代对象进行排序。使用sorted对列表进行排序将得到一个新的列表,而原列表不会改变。sorted函数的语法:sorted(iterable, key=None, reverse=False)
iterable:可迭代对象
key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。(关于key的使用详见本文第六部分 列表的高级应用)
reverse:排序规则,reverse = True 降序 , reverse = False 升序(默认)。
>>>odd_numbers = [7,1,3,9,5]
>>>sorted(odd_numbers) # 简单排序,默认为升序
[1, 3, 5, 7, 9]
>>>odd_numbers
[7, 1, 3, 9, 5]
>>>sorted(odd_numbers,reverse = True) # 降序
[9, 7, 5, 3, 1]
# 获得排序后的列表
>>>sorted_odd_numbers = sorted(odd_numbers,reverse = True)
>>>sorted_odd_numbers
[9, 7, 5, 3, 1]
sort是列表的一种方法,使用它将直接改变原有列表。sort方法的语法:list.sort( key=None, reverse=False)。key和reverse的作用与sorted函数相同。
from random import randint
numbers = []
for i in range(10):
numbers.append(randint(0,101))
print(numbers)
[74, 34, 20, 30, 35, 80, 60, 95, 20, 4]
numbers.sort()
print(numbers)
[4, 20, 20, 30, 34, 35, 60, 74, 80, 95]
numbers.sort(reverse=True)
print(numbers)
[95, 80, 74, 60, 35, 34, 30, 20, 20, 4]
列表的嵌套即在列表中在嵌套列表,如下所示:
>>>data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
>>>data
[['Tom', 21, '20202501'], ['Jim', 20, '20181717'], ['Susan', 19, '20201908']]
>>>len(data)
3
data中包含有3个子列表,每个子列表包含有姓名、年龄和学号三个信息。
获得Jim的所有信息
>>>data[1]
['Jim', 20, '20181717']
获得Jim的年龄
>>>data[1][1]
20
修改Jim的学号
>>>data[1][2] = '20181720'
>>>data
[['Tom', 21, '20202501'], ['Jim', 20, '20181720'], ['Susan', 19, '20201908']]
将性别添加到年龄后面
>>>data[0].insert(2,"男")
>>>data[1].insert(2,"男")
>>>data[2].insert(2,"女")
>>>data
[['Tom', 21, '男', '20202501'], ['Jim', 20, '男', '20181720'], ['Susan', 19, '女', '20201908']]
将Susan的信息从列表中删除
>>>data.pop()
['Susan', 19, '女', '20201908']
>>>data
[['Tom', 21, '男', '20202501'], ['Jim', 20, '男', '20181720']]
或者
>>>del data[-1]
>>>data
[['Tom', 21, '男', '20202501'], ['Jim', 20, '男', '20181720']]
删除所有学号信息
data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
for i in data:
i.pop()
print(data)
[['Tom', 21], ['Jim', 20], ['Susan', 19]]
获得所有人的姓名
data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
names = []
for i in data:
names.append(i[0])
print(names)
['Tom', 'Jim', 'Susan']
将以上data中的信息按照子列表中的学号信息升序排序
我们可以使用sort或sorted进行排序,按照要求我们需要根据个人的学号信息进行排序,它在个人信息中索引是2。
这里我们将使用key这个参数,如前所述,它的作用是指定排序比较的元素,key参数的值应该是一个获取比较元素的函数,此函数将在每个元素比较前被调用。
data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
data.sort(key = lambda x:x[2]) # 利用lambda构造函数
print(data)
[['Jim', 20, '20181717'], ['Susan', 19, '20201908'], ['Tom', 21, '20202501']]
也可以直接定义一个函数作为key的值
def getindex(index):
return index[2]
data = [['Tom', 21, '20202501'], ['Jim', 20, '20181717'], ['Susan', 19, '20201908']]
data.sort(key=getindex)
print(data)
[['Jim', 20, '20181717'], ['Susan', 19, '20201908'], ['Tom', 21, '20202501']]
再看一个列表中字典的排序,要求根据key为1的值进行排序。[2](在原文基础上有一定改动)
L = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
def f2(a):
return a[1]
L.sort(key = f2)
print(L)
[{1: 1, 2: 4, 5: 6}, {1: 3, 6: 3}, {1: 5, 3: 4}, {1: 9}]
列表推导式(list comprehension)也称为列表解析式,是一种创建列表的简洁语法。
假设要生成一个1到100以内所有偶数,我们常规的做法是:
numbers = []
for i in range(1,101):
if i % 2 == 0:
numbers.append(i)
print(numbers)
使用列表推导式我们可以简化为:
numbers = [x for x in range(1,101) if x % 2 == 0]
print(numbers)
是不是感觉简化了很多,列表推导式只有一行代码。
列表推导式的结构:[添加的目标元素 for 变量 in 可迭代的序列 if 筛选的条件]
再看几个例子:
# 将10以内所有奇数的平方存入列表
numbers = [x**2 for x in range(1,11) if x % 2 != 0]
print(numbers)
[1, 9, 25, 49, 81]
# 将列表中所有起始为‘b’的单词存入列表
word_startwith_b = [x for x in ['red','blue','green','black','pink'] if x.startswith('b')]
print(word_startwith_b)
['blue', 'black']
# 将列表中所有单词存入列表
animals = [x for x in ['lion','tiger',1,333,'elephant'] if str(x).isalpha()]
print(animals)
['lion', 'tiger', 'elephant']
原意是创建一个包含3个空的子列表的列表,然后将0存入其中第2个列表下,但是输出后发现,三个子列表都新增了0。
观察发现,3个子列表都是同一个id。
numbers = [[]] * 3
numbers
[[], [], []]
numbers[1].append(0)
numbers
[[0], [0], [0]]
for i in range(len(numbers)):
... print(id(numbers[i]))
...
4472764480
4472764480
4472764480
正确的方法如下:
numbers = [[] for i in range(3)]
print(numbers)
for index in range(len(numbers)):
numbers[index].append(index)
print(id(numbers[index]))
print(numbers)
[[], [], []]
4414227648
4414217216
4414678208
[[0], [1], [2]]
1.列表基础练习
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
完成以下任务:
1.在列表的最后插入100
2.将30插入到列表的中间位置
3.将索引为3的元素删除
4.将[22,33,44]合并到列表的最后
5.将列表中的元素从大到小、从小到大各排序一次。
2.列表复杂练习
lst = [11, 22, 33, [44, 55, 66, 77, [88, 99, 100, 110]]]
编程完成以下任务:
1.输出lst的长度
2.输出lst中元素的和
3.将55修改为5555
4.输出99
5.将[7788,8899]插入到66的后面
6.找出列表中所有元素的最大值
在完成以上操作后,思考回答以下问题:
1.lst[-1][-1][-2]是什么?
2.len(lst[-1][-1])是多少?
3.lst[-1][1:3]是什么?
4.lst[-1][-1][1:-2]是什么?
3.有一个已经排好序的列表[23, 24, 30, 32, 40, 46, 61, 65, 87, 96],用户随机输入一个数,将它按原有规律插入列表中。
4.products = [["iphone12(128G)",6799],["Macbook air",9799],["HUAWEI P40 Pro",7988],["Moccona #8 Coffee",109],["Fluent Python Book",95],["Nike",699]],需打印出以下格式。
---------- 商品列表 ----------
0 iphone12(128G) 6799
1 Macbook air 9799
2 HUAWEI P40 Pro 7988
3 Moccona #8 Coffee 109
4 Fluent Python Book 95
5 Nike 699
5.在上题基础上,编写一个程序,实现不断询问用户想买什么,提示用户输入商品编号,就把对应的商品添加到购物车里,同时显示当前购物车中的商品列表和总价格,最终用户输入q退出时,打印购买的商品列表及总价格。
1.有一分数序列,2/1、3/2、5/3、8/5、13/8、21/13……,求出这个数列的前20项之和。
x = 2
y = 1
summary = 0
for i in range(20):
summary = x/y
x,y = x+y,x
print(x,y)
print('数列的前20项之和为%.4f'%summary)
2.求1+2!+3!+4!+……+20!的值。
summary = 0
for i in range(1,21):
n = 1
for j in range(1,i+1):
n *= j
summary += n
print('1+2!+3!+4!+……+20!的值为%i'%summary)
3.将“hello world”用相反顺序打印出来。
words = "hello world"
print(words[::-1])
4.判断字符串中是否有连续三个英文单词。如:"Hello World hello"的结果为True、"He is 123 man"的结果为False、"1 2 3 4"结果为False、"bla bla bla bla"的结果为True。(提醒:可能需要用到split()、isalpha()、isdigit()等函数)
words = "He is 123 a 23 good man"
sum = 0
for word in words.split():
if word.isalpha():
sum += 1
if sum == 3:
print(True)
break
elif word.isdigit():
sum = 0
else:
print(False)
参考文献:
[1]Python3列表.https://www.runoob.com/python3/python3-list.html
[2]https://www.zhihu.com/question/36280272