14 再谈列表
掌握列表非常重要哦
大纲
列表的更多操作
列表解析
列表和字符串的相互转换
列表的嵌套
练习:数字移位
练习:苹果编号
列表的更多操作
前一课我们学习了列表的操作,列表可以用于处理一大串数字,在python编程中用处非常广泛。其实列表中的元素不仅可以用来保存数值,还可以用来保存字符串。例如我们可以用列表来定义学校中一天的课程。要注意在定义这个中文字符串构成的列表时,除了汉字本身以外的所有标点符号都需要是英文格式。
course = ['语文','数学','英语','历史','体育','音乐']
print(course)
['语文', '数学', '英语', '历史', '体育', '音乐']
一个经常用的函数是len,用于计算列表的长度,也就是列表中有多少个元素。
len(course)
6
这个字符串元素构成的列表和数值构成的列表一样,可以做选择、新增和修改的操作。
course[0] #选择第一门课
'语文'
course[1] = '语文' #将第二门数学课修改为语文
如果想判断某个列表中是否包括某个元素,可以通过in来判断条件。
'自习' in course
False
course.append('自习') #增加一个自习课
'自习' in course
True
做修改后课程就变成下面的样子了。
print(course)
['语文', '语文', '英语', '历史', '体育', '音乐', '自习']
如果是想删除列表中的某个元素,有两种方法,一种是使用del,另一种是使用pop
del course[0]
del命令可用于删除列表中任一个位置的元素。上例中是删除了第一个。
course.pop()
'自习'
pop则是默认删除列表中最后一个位置中的元素,同时将这个元素返回出来。
course
['语文', '英语', '历史', '体育', '音乐']
列表还可以通过加号进行拼接
['语文', '英语', '历史'] + ['体育', '音乐']
['语文', '英语', '历史', '体育', '音乐']
选择列表中的元素的时候,不仅可以选择某个元素,还可以选择某一些元素,例如我们选出上午四门课。
course = ['语文','数学','英语','历史','体育','音乐','自习']
course[0:4]
['语文', '数学', '英语', '历史']
方括号内不再是某一个数字编号,而是一个起始编号加冒号加结束编号,也就是从0号位置到4号位置之前的元素都选择出来,注意4号位置并不选出。如果起始编号是从0号开始的,这个起始编号可以省略不写,如下例一样。
course[:4]
['语文', '数学', '英语', '历史']
然后我们再把下午的三门课选出来,编号就是从4号位置开始,一直到最后,这个结束编号可以省略不写。
course[4:]
['体育', '音乐', '自习']
我们也可以从后面往前选择,从倒数第三门课开始选择,和上面的结果是一样的
course[-3:]
['体育', '音乐', '自习']
列表解析
上一课我们见到了,可以通过循环来处理列表中的每一个元素,例如找到20以内的偶数。
numbers_even = []
for x in range(20):
if x%2==0:
numbers_even.append(x)
print(numbers_even)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
有一种更简洁的循环写法,称为列表解析,列表解析的写法和循环非常相似,其中for...in的关键词用法完全一样,不过是写在一行内,之后可以增加if条件进行过滤筛选,将需要的x写在最前面,最后是用一对方括号放在两边,这样整体的输出是一个列表。
[x for x in range(20) if x%2==0]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
同样,让我们用列表解析来处理字符串列表,例如把这天课程中不包括“自习”的课程选择出来。在这里使用了一个新的比较操作符,!=就是不等的意思。
[x for x in course if x!='自习']
['语文', '数学', '英语', '历史', '体育', '音乐']
选择出这天课程中不包括自习和音乐的课程出来,in是用来判断x是否在某个列表中,如果不在自习、音乐课的列表中的课程会被筛选出来
[x for x in course if x not in ['自习','音乐']]
['语文', '数学', '英语', '历史', '体育']
列表和字符串的相互转换
列表可以整合成一个大的字符串,一个大的字符串也可以分拆成一个列表,让我们看一个例子。
cource_str = '_'.join(course)
print(cource_str)
type(cource_str)
语文_数学_英语_历史_体育_音乐_自习
str
列表通过一个下划线符号进行连接,整体成为一个字符串,下例再逆反回去,用split函数,再将这个大的字符串分拆成一个列表。
cource_str.split('_')
['语文', '数学', '英语', '历史', '体育', '音乐', '自习']
列表的嵌套
列表不仅可以保存数值和字符串,它还可以保存列表,也就是说列表的元素也可以是列表。这种称之为嵌套列表。下例我们用一个列表来表示各门课程以及对应的成绩分数。其中每个元素都是一个有两个元素的小列表,小列表中第一个位置是存放课程,第二个位置是存放分数。
course = [['语文',85],['数学',90],['英语',94],['历史',87],['体育',85],['音乐',98]]
让我们选择出分数大于90分的课程,使用列表解析就非常方便,遍历列表,其中课程的分数放在第二个位置,所以用c[1]表示,如果分数大于90,就输出c[0],就是课程的名字
[c[0] for c in course if c[1]>90]
['英语', '音乐']
再来计算下这几门课的平均分数,先用来个列表解析将所有的分数取出,再循环遍历所有的分数,将分数累加,再用这个累加的分数去除以课程的个数,最后用round四舍五入一下,得到平均分。
score = [c[1] for c in course]
sum_score = 0
for s in score:
sum_score = sum_score + s
avg_score = round(sum_score/len(score),1)
print(avg_score)
89.8
练习:数字移位
一个列表中由1-5这五个数字元素填充,将它们进行循环移位,[1,2,3,4,5] 变成 [2,3,4,5,1]
x = [1,2,3,4,5]
temp = x[0]
for i in range(len(x)-1):
x[i]=x[i+1]
x[-1] = temp
print(x)
[5, 1, 2, 3, 4]
练习:苹果编号
30个苹果排成一个圆圈,每个苹果上进行顺序编号,从0到29,从0开始数,每数7个苹果则将这个苹果取出来放到一边去。拿走一半的苹果后停止,问剩下的苹果,编号是哪些?
# a列表表示哪个位置上被取出为1,未取到为0
a = []
for i in range(30):
a.append(0)
num = 0 # num为一共取出个数
i = 0 # i表示位置
k = 0 # k表示每K个取出
while num<15:
if i>29: # 队尾数字从头开始
i = 0
if a[i]==0: # 此位置上未取出,则计数K
k = k+1
if k==9: # 数到第K则取出
a[i]=1
k=0
num = num+1
i = i+1
for i in range(30):
if a[i] ==0:
print(i,end=" ")
0 1 2 3 9 10 12 13 14 16 19 20 24 27 28
Last updated
Was this helpful?