概述
目录
列表
1.1列表的创建和使用
1.2列表解析
1.3列表实现堆栈
1.4列表实现队列
Python中的术语对象用来表示某种数据类型的任意实例。Python的核心对象是数值、字符串、列表、元组、集合、字典和文件。本单元将介绍列表、元组、集合和字典。文件将在单元5介绍。
列表
列表是Python中最基本的数据结构,也是最常用的Python数据类型,列表的数据项不需要具有相同的类型。列表为每个元素分配一个数字,表示它的位置或索引。第一个索引是0,第二个索引是1,以此类推。
列表的特点是通过一个变量存储多个数据值,且数据类型可以不同。另外,列表可以修改,如添加或删除列表中的元素。
Python中内置了很多函数或方法来操作列表,主要包括索引、分片、列表操作符加和乘,以及其他一些函数和方法,如计算列表长度、最大值、最小值等函数以及添加、修改或删除列表元素的方法等。
1.1列表的创建和使用
1)列表的创建
列表的创建方法是用方括号括起所有元素,并且元素之间用逗号分隔。若使用一对空的括号,创建的是一个空的列表。如num=[1,2,3,4,5]。
列表创建后,逐一输出列表的元素称为列表的遍历。由于列表中可以存放很多元素,因此遍历列表通常需要使用循环结构。可以用下述4中方法来遍历列表元素:
(1)使用in操作符遍历
(2)使用range()函数或者xrange()函数
(3)使用iter()函数遍历,它是一个迭代器函数
(4)使用enumerate()函数遍历。该函数用于遍历序列中的元素及其下标
列表元素遍历示例程序:
print('第一种遍历方法,使用in操作符')
mylist=['1001','Apple',4.5,'山东','2016-9',300]
for item in mylist:
print(item,end=' ')
print()
print('第二种遍历方法,使用range()或者xrange()函数')
listLen=len(mylist)
for i in range(listLen):
print(item,end=' ')
print()
print('第三种遍历方法,使用iter()函数')
for item in iter(mylist):
print(item,end=' ')
print()
print('第四种遍历方法,enumerate()函数')
for item in enumerate(mylist):
print(item,end=' ')
运行结果:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
第一种遍历方法,使用in操作符
1001 Apple 4.5 山东 2016-9 300
第二种遍历方法,使用range()或者xrange()函数
300 300 300 300 300 300
第三种遍历方法,使用iter()函数
1001 Apple 4.5 山东 2016-9 300
第四种遍历方法,enumerate()函数
(0, '1001') (1, 'Apple') (2, 4.5) (3, '山东') (4, '2016-9') (5, 300)
Process finished with exit code 0
总感觉上面第二种遍历方法的结果是错的?以后再仔细摸索。第二种方法中根本就没有item,所以第9行哪里来的item?将第九行改成print(mylist[i],end=' ')之后结果是正确的。
2)列表元素的访问与列表的切片
与字符串类似,列表中的元素也是从前往后使用从0开始的正向索引,或使用从-1开始的从后往前的逆向索引来标注元素的位置。
列表使用索引来访问列表中的元素,或使用方括号形式的切片功能来截取子列表。
切片语法格式:
a:b,且a<b
功能:是从a表示的索引开始到b-1表示的索引为止的所有元素组成的子列表。
a和b取值不同时的切片含义如下表所示:
切片语句 | 含义 |
list[m:n] | 得到一个索引从m开始到n-1为止的元素所构成的子列表 |
list[:] | 得到一个与list一样的新列表,也就是包含所有元素 |
list[m:] | 得到一个从索引m开始到列表末尾所有元素组成的子列表 |
list[:n] | 得到一个从开始到n-1索引为止的元素组成的子列表 |
索引和切片应用示例程序:
#分别输入年月日,组合后以对应的英文形式输出
months=['January','February','March','April','May','June','July','August','September','October','November','December']
#定义1~31天的英文后缀
endings=['st','nd','rd']+17*['th']+['st','nd','rd']+7*['th']+['st']
year=input('Year:')
month=int(input('Month(1-12):'))
day=int(input('Day(1-31):'))
month_name=months[month-1]
ordinal=str(day)+endings[day-1]
print(month_name+' '+ordinal+'.'+year)
print('Spring is ',months[1:4])
print('Autumn is ',months[-5:-2])
运行结果:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
Year:2019
Month(1-12):7
Day(1-31):22
July 22nd.2019
Spring is ['February', 'March', 'April']
Autumn is ['August', 'September', 'October']
Process finished with exit code 0
3)更新列表
Python允许对列表的数据项进行修改或更新。如果对列表中的任意一项重新赋值,相当于修改,也可以使用append()方法添加新的列表项。
例如:
list=[1,2,3,4,5,6,7]
list[2]=10 #把列表的第三项由原来的3改为10
list.append(8) #在列表的尾部增加一个新元素8,列表变为[1,2,3,4,5,6,7,8]
4)删除列表
Python中使用del语句来删除列表的元素。例如:
list=[1,2,3,4,5,6,7]
del list[2] #删除列表中的第三个元素,结果为[1,2,4,5,6,7]
del list[2:4] #删除索引从2开始到3的元素,结果为[1,2,6,7]
del list #删除整个列表
Python中的pop()方法可以从列表中获取某索引位置的元素并删除这个元素。当从列表中弹出一个值时,其后的元素会依次向前移动一个位置。例如:
t=['a','b','c','d']
t.pop(2)
print(t) #结果为['a','b','d']
如果pop()方法中没有指定要弹出元素的索引,则弹出最后一个元素。例如:
t=['a','b','c','d']
print(t.pop()) #输出弹出的元素d
print(t) #结果为['a','b','c']
5)列表操作符
列表的+和*的操作符与字符串相似。其中,+用于合并列表,*用于重复列表。成员运算符in和not in用来测试元素是否在列表中。使用方法如下表所示:
Python语句 | 结果 | 说明 |
len([1,2,3,4,5]) | 5 | 列表的长度(元素个数) |
[1,2,3,4]+[5,6,7] | [1,2,3,4,5,6,7] | 合并两个列表为一个列表 |
['abc']*4 | ['abc','abc','abc','abc'] | 列表重复4次 |
[3] in [1,2,3,4,5] | True | 检测元素是否在列表中 |
[3] not in [1,2,3,4,5] | False | 检测元素是否不在列表中 |
for x in [1,2,3]:print x | 1 2 3 | 循环迭代 |
6)列表操作的函数和方法
操作列表时,函数和方法的区别在于:函数操作中,列表对象作为函数的参数;而方法操作中,通过列表对象名.方法名(参数表)的形式来调用方法。
列表中常用的函数如下表,其中list1=[1,2,3,4,5]
函数名 | 实例 | 结果 | 功能描述 |
len(list) | print(len(list1)) | 5 | 计算列表元素个数 |
max(list) | print(max(list1)) | 5 | 返回列表元素最大值 |
min(list) | print(min(list1)) | 1 | 返回列表元素最小值 |
sum(list) | print(sum(list1)) | 15 | 列表中所有元素求和 |
list(seq) | print(list('a','b','c')) | ['a','b','c'] | 将元组转换为列表 |
列表中的常用方法如下表:
函数名 | 实例 | 结果 | 功能描述 |
append(obj) | t=['a','b','c'] t.append('d') | ['a','b','c','d'] | 在列表末尾添加新的对象 |
count(obj) | t=['a','b','c'] print(t.count('a')) | 1 | 统计某个元素在列表中出现的次数 |
extend(seq) | t=['a','b','c'] t.extend(['c','d']) | ['a','b','c','c','d'] | 在列表末尾一次性追加另一个序列中的多个值 |
index(obj) | t=['a','b','c','a'] print(t.index('a')) | 0 | 从列表中找出与某个值第一次匹配的索引位置 |
insert(index,obj) | t=['a','b','c','d'] t.insert(2,'q') | ['a','b','q','c','d'] | 将对象插入列表中index索引所指的位置 |
pop(index) | t=['a','b','c','d'] print(t.pop(2)) | c | 删除列表中的一个元素,并返回该元素的值 |
remove(obj) | t=['a','b','c','a'] t.remove('a') | ['b','c','a'] | 删除列表中某个值的第一个匹配项 |
reverse() | t=['a','b','c','d'] t.reverse() | ['d','c','b','a'] | 反向列表元素 |
sort([func]) | t=['a','e','d','b'] t.sort() | ['a','b','d','e'] | 对原列表排序 |
注意:
- 列表在执行了del()方法或者remove()方法之后,列表中被删除元素之后的其他元素会依次向前移动一个位置;
- 列表在执行了insert()方法之后,列表中大于等于给定索引位置的所有元素会依次向后移动一个位置。新增加的元素添加在index所指示的位置;
- 使用append()方法时,如果参数也是一个列表对象,要添加的列表对象会作为一个单独的元素来处理,即相当于一个嵌套列表;例如:t=['a','b','c','d'] t.append(['e','f']) 运行结果是['a','b','c','d',['e','f']]
- 如果只是想合并两个列表,不想得到上述嵌套的列表,不适用append()方法,而采用extend()方法;
- 列表使用sort()方法和reverse()方法之后会重新排列列表,因此原来元素的索引会发生改变,在新列表中引用元素时要注意。
7)嵌套列表
Python中支持嵌套列表,即列表中的元素也是列表,也称多维列表。Python中对于嵌套列表的层次数据没有限制,但是最好不要超过三层,否则会增加处理的复杂度。
对于两层嵌套列表而言,在嵌套列表中,一级索引的含义与普通列表相同。例如,对于列表t=[[t00,t01,t02],[t10,t11,t12],[t20,t21,t22]],t[0]表示第一个元素[t00,t01,t02];对于列表中的每个元素,即子列表中的所有元素,需要使用二级索引来表示。例如,t[1][2]表示第二个子列表中的第三个元素t12。
嵌套列表的遍历需要使用多重循环结构。如果只是嵌套两层,可以使用两重循环结构来遍历;如果嵌套层数大于两层,建议使用递归函数来遍历。
两层嵌套列表遍历示例程序:
mylist=[['1001','Apple',4.5,'山东','2006-9',300],
['1002','Banana',2.5,'海南','2017-2',500],
['1001','Orange',3.5,'四川','2016-12',350]]
for each in mylist:
for item in each:
print(item,end=' ')
print()
运行结果:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
1001 Apple 4.5 山东 2006-9 300
1002 Banana 2.5 海南 2017-2 500
1001 Orange 3.5 四川 2016-12 350
Process finished with exit code 0
编写一个Python程序,实现学生成绩统计。要求输入n个学生的学号、姓名和语文、数学、英语、综合四门课程的成绩,生成每个学生的总成绩和平均成绩,统计并输出各科成绩最高分、最低分以及平均分和总平均分。
程序如下:
print('学生信息统计')
num=int(input('请输入学生人数:'))
if num<0:
print('输入错误!')
exit(0)
grade=[]
for i in range(num):
stu=[]
stu.append(input('请输入学生的学号:'))
stu.append(input('请输入学生的姓名:'))
stu.append(int(input('请输入学生的语文成绩:')))
stu.append(int(input('请输入学生的数学成绩:')))
stu.append(int(input('请输入学生的英语成绩:')))
stu.append(int(input('请输入学生的综合成绩:')))
grade.append(stu)
for i in range(num):
stu=grade[i]
stu.append(stu[2]+stu[3]+stu[4]+stu[5])
stu.append(stu[6]/4)
for i in range(num):
print(grade[i])
yuwen=[]
shuxue=[]
yingyu=[]
zonghe=[]
zp=[]
for i in range(num):
yuwen.append(grade[i][2])
shuxue.append(grade[i][3])
yingyu.append(grade[i][4])
zonghe.append(grade[i][5])
zp.append(grade[i][7])
minyuwen=min(yuwen)
maxyuwen=max(yuwen)
minshuxue=min(shuxue)
maxshuxue=max(shuxue)
minyingyu=min(yingyu)
maxyingyu=max(yingyu)
minzonghe=min(zonghe)
maxzonghe=max(zonghe)
yuwenp=sum(yuwen)/num
shuxuep=sum(shuxue)/num
yingyup=sum(yingyu)/num
zonghep=sum(zonghe)/num
zpf=sum(zp)/num
print('{}最高分是{},最低分是{},平均分是{:.2f}'.format('语文',maxyuwen,minyuwen,yuwenp))
print('{}最高分是{},最低分是{},平均分是{:.2f}'.format('数学',maxshuxue,minshuxue,shuxuep))
print('{}最高分是{},最低分是{},平均分是{:.2f}'.format('英语',maxyingyu,minyingyu,yingyup))
print('{}最高分是{},最低分是{},平均分是{:.2f}'.format('综合',maxzonghe,minzonghe,zonghep))
print('总平均分是{:.2f}'.format(zpf))
运行结果如下:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
学生信息统计
请输入学生人数:5
请输入学生的学号:1001
请输入学生的姓名:lilei
请输入学生的语文成绩:90
请输入学生的数学成绩:101
请输入学生的英语成绩:98
请输入学生的综合成绩:201
请输入学生的学号:1002
请输入学生的姓名:wanghua
请输入学生的语文成绩:105
请输入学生的数学成绩:78
请输入学生的英语成绩:121
请输入学生的综合成绩:210
请输入学生的学号:1003
请输入学生的姓名:zhaoming
请输入学生的语文成绩:115
请输入学生的数学成绩:135
请输入学生的英语成绩:90
请输入学生的综合成绩:234
请输入学生的学号:1004
请输入学生的姓名:wangliang
请输入学生的语文成绩:70
请输入学生的数学成绩:82
请输入学生的英语成绩:99
请输入学生的综合成绩:148
请输入学生的学号:1005
请输入学生的姓名:lixiao
请输入学生的语文成绩:121
请输入学生的数学成绩:119
请输入学生的英语成绩:100
请输入学生的综合成绩:235
['1001', 'lilei', 90, 101, 98, 201, 490, 122.5]
['1002', 'wanghua', 105, 78, 121, 210, 514, 128.5]
['1003', 'zhaoming', 115, 135, 90, 234, 574, 143.5]
['1004', 'wangliang', 70, 82, 99, 148, 399, 99.75]
['1005', 'lixiao', 121, 119, 100, 235, 575, 143.75]
语文最高分是121,最低分是70,平均分是100.20
数学最高分是135,最低分是78,平均分是103.00
英语最高分是121,最低分是90,平均分是101.60
综合最高分是235,最低分是148,平均分是205.60
总平均分是127.60
Process finished with exit code 0
编写一个Python程序,实现对学生如下信息的管理:学号、姓名、性别、出生日期、电话和邮箱。要求提供菜单选择,实现学生信息的录入、查询、增加、修改、删除、排序等操作。
程序代码如下:
print('tt学生系统管理')
grade=[]
num=0
while True:
print('1.录入')
print('2.查找')
print('3.添加')
print('4.修改')
print('5.删除')
print('6.排序')
print('7.显示')
print('0.退出')
choice=int(input('请输入你的选择(0-7):'))
if choice<0 or choice>7:
print('输入非法,请重新输入!')
if choice==0:
break
if choice==1:
num=int(input('请输入学生人数:'))
if num<0:
print('输入错误!')
break
for i in range(num):
stu=[]
stu.append(input('请输入学生的学号:'))
stu.append(input('请输入学生的姓名:'))
stu.append(input('请输入学生的性别:'))
stu.append(input('请输入学生的出生日期:'))
stu.append(input('请输入学生的电话:'))
stu.append(input('请输入学生的邮箱:'))
grade.append(stu)
if choice==2:
que=input('请输入查找关键字')
for i in range(num):
stu=grade[i]
if que in stu:
print('你要找的学生信息如下:')
print(stu)
break
else:
print('未找到!')
if choice==3:
index=int(input('请输入要添加的位置'))
if index<0 or index>len(grade):
print('输入错误')
else:
stu = []
stu.append(input('请输入学生的学号:'))
stu.append(input('请输入学生的姓名:'))
stu.append(input('请输入学生的性别:'))
stu.append(input('请输入学生的出生日期:'))
stu.append(input('请输入学生的电话:'))
stu.append(input('请输入学生的邮箱:'))
grade.insert(index,stu)
num+=1
if choice==4:
sno=input('请输入要修改信息的学生的学号')
for i in range(num):
stu=grade[i]
if sno in stu:
print('你要修改的学生的原信息如下:')
print(stu)
while True:
print('1.修改学号')
print('2.修改姓名')
print('3.修改性别')
print('4.修改出生日期')
print('5.修改电话')
print('6.修改邮箱')
print('0.退出')
ch=int(input('请输入你的选择(0-6)'))
if ch<0 or ch>6:
print('输入非法,请重新输入')
if ch==0:
break
elif ch==1:
stu[0]=input('请输入学生的学号')
elif ch==2:
stu[1]=input('请输入学生的姓名')
elif ch==3:
stu[2]=input('请输入学生的性别')
elif ch==4:
stu[3]=input('请输入学生的出生日期')
elif ch==5:
stu[4]=input('请输入学生的电话')
elif ch==6:
stu[5]=input('请输入学生的邮箱')
print('修改后的学生信息')
print(stu)
else:
print('未找到')
if choice==5:
sno=input('请输入要删除的学生的学号')
for i in range(num):
stu=grade[i]
if sno in stu:
print('你要删除的学生信息如下:')
print(stu)
ok=input('你确定要删除吗(Y/N):')
if ok=='y' or ok=='Y':
grade.pop(i)
num-=1
print('已成功删除')
break
else:
print('未找到')
if choice==6:
while True:
print('请选择排序关键字:')
print('1.按学号')
print('2.按姓名')
print('3.按性别')
print('4.按出生日期')
print('5.按电话')
print('6.按邮箱')
print('0.退出')
ch=int(input('请输入你的选择(0-6):'))
if ch==0:
break
if ch<0 or ch>6:
print('输入非法,请重新输入')
if ch==1:
grade.sort(key=lambda x:x[0],reverse=False)
elif ch==2:
grade.sort(key=lambda x: x[1], reverse=False)
elif ch==3:
grade.sort(key=lambda x: x[2], reverse=False)
elif ch==4:
grade.sort(key=lambda x: x[3], reverse=True)
elif ch==5:
grade.sort(key=lambda x: x[4], reverse=True)
elif ch==6:
grade.sort(key=lambda x: x[5], reverse=True)
if choice==7:
for i in range(num):
print(grade[i])
运行结果如下:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
学生系统管理
1.录入
2.查找
3.添加
4.修改
5.删除
6.排序
7.显示
0.退出
请输入你的选择(0-7):1
请输入学生人数:3
请输入学生的学号:101
请输入学生的姓名:zhanghua
请输入学生的性别:nv
请输入学生的出生日期:1994-03-21
请输入学生的电话:11111111
请输入学生的邮箱:zhanghua@126.com
请输入学生的学号:102
请输入学生的姓名:liming
请输入学生的性别:nan
请输入学生的出生日期:1995-05-12
请输入学生的电话:22222222
请输入学生的邮箱:liming@163.com
请输入学生的学号:103
请输入学生的姓名:wanghong
请输入学生的性别:nv
请输入学生的出生日期:1995-04-27
请输入学生的电话:3333333
请输入学生的邮箱:wanghong@sohu.com
1.录入
2.查找
3.添加
4.修改
5.删除
6.排序
7.显示
0.退出
请输入你的选择(0-7):2
请输入查找关键字102
你要找的学生信息如下:
['102', 'liming', 'nan', '1995-05-12', '22222222', 'liming@163.com']
1.录入
2.查找
3.添加
4.修改
5.删除
6.排序
7.显示
0.退出
请输入你的选择(0-7):3
请输入要添加的位置2
请输入学生的学号:104
请输入学生的姓名:liuming
请输入学生的性别:nan
请输入学生的出生日期:1994-06-18
请输入学生的电话:44444444
请输入学生的邮箱:liuming@126.com
1.录入
2.查找
3.添加
4.修改
5.删除
6.排序
7.显示
0.退出
请输入你的选择(0-7):7
['101', 'zhanghua', 'nv', '1994-03-21', '11111111', 'zhanghua@126.com']
['102', 'liming', 'nan', '1995-05-12', '22222222', 'liming@163.com']
['104', 'liuming', 'nan', '1994-06-18', '44444444', 'liuming@126.com']
['103', 'wanghong', 'nv', '1995-04-27', '3333333', 'wanghong@sohu.com']
1.录入
2.查找
3.添加
4.修改
5.删除
6.排序
7.显示
0.退出
请输入你的选择(0-7):4
请输入要修改信息的学生的学号103
未找到
未找到
未找到
你要修改的学生的原信息如下:
['103', 'wanghong', 'nv', '1995-04-27', '3333333', 'wanghong@sohu.com']
1.修改学号
2.修改姓名
3.修改性别
4.修改出生日期
5.修改电话
6.修改邮箱
0.退出
请输入你的选择(0-6)5
请输入学生的电话13700112211
1.修改学号
2.修改姓名
3.修改性别
4.修改出生日期
5.修改电话
6.修改邮箱
0.退出
请输入你的选择(0-6)0
修改后的学生信息
['103', 'wanghong', 'nv', '1995-04-27', '13700112211', 'wanghong@sohu.com']
1.录入
2.查找
3.添加
4.修改
5.删除
6.排序
7.显示
0.退出
请输入你的选择(0-7):5
请输入要删除的学生的学号101
你要删除的学生信息如下:
['101', 'zhanghua', 'nv', '1994-03-21', '11111111', 'zhanghua@126.com']
你确定要删除吗(Y/N):Y
已成功删除
1.录入
2.查找
3.添加
4.修改
5.删除
6.排序
7.显示
0.退出
请输入你的选择(0-7):6
请选择排序关键字:
1.按学号
2.按姓名
3.按性别
4.按出生日期
5.按电话
6.按邮箱
0.退出
请输入你的选择(0-6):2
请选择排序关键字:
1.按学号
2.按姓名
3.按性别
4.按出生日期
5.按电话
6.按邮箱
0.退出
请输入你的选择(0-6):0
1.录入
2.查找
3.添加
4.修改
5.删除
6.排序
7.显示
0.退出
请输入你的选择(0-7):0
Process finished with exit code 0
key=lambda x:x[1]为对前面对象中的第二维数据的值进行排序。key=lambda 变量: 变量[维数],其中维数可以按照自己的需要进行设置。
1.2列表解析
Python的强大特性之一是对list的解析。通过对list中的每个元素应用一个函数进行计算,将一个列表映射为另一个列表。
列表解析又叫列表推导式,比for更精简,运算更快,特别是对于较大的数据集合。以定义方式得到列表,通常要比使用构造函数创建这些列表更清晰。
列表解析的基本语法格式如下:
[<表达式> for <变量> in <列表>] 或 [<表达式> for <变量> in <列表> if <条件>]
其功能是将表达式应用到每个变量上,为新的列表创建一个新的数据值。表达式可以是任何运算表达式,变量是列表中遍历的元素的值。
(1)简单的列表解析
t=[x for x in range(1,10)]
print(t) #结果是:[1,2,3,4,5,6,7,8,9]
t=[x*x for x in range(1,10)]
print(t) #结果是:[1,4,9,16,25,36,49,64,81]
(2)两次循环
t=[x for x in range(1,5)]
s=[x for x in range(5,8)]
print(t) #输出[1,2,3,4]
print(s) #输出[5,6,7]
print([x*y for x in t for y in s]) #输出[5,6,7,10,12,14,15,18,21,20,24,28]
列表解析应用示例程序:
import random
mylist = [random.randint(0,100) for i in range(10)] #生成0~100内的10个随机数列表
print(mylist)
mylist2=[i*i for i in mylist] #对列表中的每个元素求平方
print(mylist2)
mylist3=[i for i in mylist if i%2==0] #挑选列表中的所有偶数
print(mylist3)
mymatrix=[[1,3,5,8],[4,2,6,7],[9,0,4,2]]
print('按行遍历矩阵')
print([row for row in mymatrix])
print('按列遍历矩阵')
print([mymatrix[row][1] for row in range(3)])
print('遍历矩阵对角线')
print([mymatrix[i][i] for i in range(3)])
transposed=[list(row) for row in zip(* mymatrix)] #使用列表解析进行矩阵转置
print('遍历矩阵的每一个元素')
print([mymatrix[row][col] for row in range(3) for col in range(4)])
print('两个矩阵相加')
mymatrixNew=[[3,6,2,5],[2,4,6,8],[7,5,2,9]]
mymatrixadd=[[mymatrix[row][col]+mymatrixNew[row][col] for col in range(4)] for row in range(3)]
print(mymatrixadd)
print('矩阵转置:')
print(transposed)
a=['4k','8k','12k']
b=['1','2','3']
c=['libaio','bio','directio']
print('获取笛卡尔积:')
result=[(x,y,z) for x in a for y in b for z in c]
print(result)
text=['Python','is','very','interesting']
maxlen=max(len(word) for word in text) #生成器表达式
maxword=[word for word in text if len(word)==maxlen]
print(maxword)
运行结果:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
[97, 40, 85, 74, 29, 33, 12, 44, 53, 71]
[9409, 1600, 7225, 5476, 841, 1089, 144, 1936, 2809, 5041]
[40, 74, 12, 44]
按行遍历矩阵
[[1, 3, 5, 8], [4, 2, 6, 7], [9, 0, 4, 2]]
按列遍历矩阵
[3, 2, 0]
遍历矩阵对角线
[1, 2, 4]
遍历矩阵的每一个元素
[1, 3, 5, 8, 4, 2, 6, 7, 9, 0, 4, 2]
两个矩阵相加
[[4, 9, 7, 13], [6, 6, 12, 15], [16, 5, 6, 11]]
矩阵转置:
[[1, 4, 9], [3, 2, 0], [5, 6, 4], [8, 7, 2]]
获取笛卡尔积:
[('4k', '1', 'libaio'), ('4k', '1', 'bio'), ('4k', '1', 'directio'), ('4k', '2', 'libaio'), ('4k', '2', 'bio'), ('4k', '2', 'directio'), ('4k', '3', 'libaio'), ('4k', '3', 'bio'), ('4k', '3', 'directio'), ('8k', '1', 'libaio'), ('8k', '1', 'bio'), ('8k', '1', 'directio'), ('8k', '2', 'libaio'), ('8k', '2', 'bio'), ('8k', '2', 'directio'), ('8k', '3', 'libaio'), ('8k', '3', 'bio'), ('8k', '3', 'directio'), ('12k', '1', 'libaio'), ('12k', '1', 'bio'), ('12k', '1', 'directio'), ('12k', '2', 'libaio'), ('12k', '2', 'bio'), ('12k', '2', 'directio'), ('12k', '3', 'libaio'), ('12k', '3', 'bio'), ('12k', '3', 'directio')]
['interesting']
Process finished with exit code 0
- 第12行代码有问题吧?是要按列遍历矩阵,但是12行的意思是输出第2列?Ans:把第10行中的row换成col并不是按列遍历矩阵,还是按行遍历,二者结果是一样的。如果把第12行代码修改一下改成输出是按列遍历的话,可能就改得和第17行代码差不多了。
- 第15行没怎么看懂?Ans:详见https://blog.csdn.net/Tyro_java/article/details/81638557
- row和col是Python已经定义好的?Ans:好像是的,因为在输入row的时候,还没输入完编辑器就会提示row了,和用户定义的普通变量不太一样,但是又没找到官方解释,先记下来,以后再说。
- 如果把第17行中的两个for换一下顺序结果会不一样吗? Ans:结果是不一样的。如果把行写在前面,就是按行依次输出;如果把列写在前面,就是按列依次输出。
编写一个Python程序,用列表解析方式输出九九乘法表。
程序如下:
'''
建立了两个变量的列表,第一个变量x从1到9,第二个变量y从1到x
并对这两个变量逐一配对,并以x*y=z的格式作为列表元素
用join()函数把所有x相同的列表元素用空格分隔连接成一个字符串
再用join()函数把每上述字符串用换行符连接,输出的是三角形结构
'''
print('n'.join([' '.join(['%s * %s = %-2s'%(y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))
运行结果是:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
Process finished with exit code 0
前几天在想注释掉一段Python代码的时候,不知道怎么注释,以为和C或C++一样,但试了一下,发现不行,原来是用3个单引号表示。
1.3列表实现堆栈
前面所讲的列表有时也称作线性表,是由一组数据元素组成的集合。线性表的第一个元素的位置称为表头,最后一个元素的位置称为表尾。在有效索引位置范围内,可以任意添加或删除元素。
栈是一种特殊的线性表,它限定插入和删除数据元素的操作只能在线性表的一端进行。栈的这种操作特点是“后进先出”。在栈中,插入操作称为入栈,删除操作称为出栈。
使用列表来模拟栈,可以使用insert()或append()方法模拟入栈,使用pop()方法模拟出栈。
1.用insert()和pop()方法模拟堆栈
采用这种方法模拟的堆栈的特点是列表的表头入栈和出栈。例如:
s=[]
s.insert(0,'a') #在列表的第一个位置添加元素,相当于在列表的表头入栈
s.insert(0,'b')
s.insert(0,'c')
print(s)
print(s.pop(0)) #在列表的第一个位置删除元素,相当于在列表的表头出栈
print(s.pop(0))
运行结果为:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
['c', 'b', 'a']
c
b
Process finished with exit code 0
2.用append()和pop()方法模拟堆栈
采用这种方法模拟的堆栈的特点是列表的表尾入栈和出栈。例如:
s=[]
s.append('a') #在列表的最后一个位置添加元素,相当于在列表的表尾入栈
s.append('b')
s.append('c')
print(s)
print(s.pop()) #在列表的最后一个位置删除元素,相当于在列表的表尾出栈
print(s.pop())
运行结果为:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
['a', 'b', 'c']
c
b
Process finished with exit code 0
编写一个Python程序,输入一个带括号的表达式,检测表达式的括号是否匹配。
程序如下:
print('本程序判断表达式的括号是否匹配')
exp=input('请输入一个带括号的表达式:')
s=[]
#在循环结构中对字符串的每一个字符进行检测
for ch in exp:
if ch=='(':
s.append(ch)
if ch==')':
if len(s)==0:
print('右括号多于左括号,不匹配!')
break
else:
s.pop()
if len(s)==0:
print('括号匹配')
else:
print('左括号多于右括号,不匹配!')
运行结果:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
本程序判断表达式的括号是否匹配
请输入一个带括号的表达式:(a+b)*((c+f)/2)/(c**2
左括号多于右括号,不匹配!
Process finished with exit code 0
1.4列表实现队列
队列也是一种特殊的线性表,它限定插入和删除数据元素的操作分别在线性表的两端进行。其中,插入元素的一端称为队头,删除元素的一端称为队尾。队列的操作特点是“先进先出”。在队列中,插入操作称为入队,删除操作称为出队。
用列表来模拟队列,可以使用insert()或append()方法模拟入队,使用pop()方法模拟出队。
1.用insert()和pop()方法模拟队列
采用这种方法模拟的队列的特点是列表的表头入队,表尾出队。例如:
s = []
s.insert(0, 'a') # 在列表的第一个位置添加元素,相当于在列表的表头入队
s.insert(0, 'b')
s.insert(0, 'c')
print(s)
print(s.pop()) # 在列表的最后一个位置删除元素,相当于在列表的表尾出队
print(s.pop())
运行结果为:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
['c', 'b', 'a']
a
b
Process finished with exit code 0
2.用append()和pop()方法模拟队列
采用这种方法模拟的队列的特点是列表的表尾入队,表头出队。例如:
s=[]
s.append('a') #在列表的最后一个位置添加元素,相当于在列表的表尾入队
s.append('b')
s.append('c')
print(s)
print(s.pop(0)) #在列表的第一个位置删除元素,相当于在列表的表头出队
print(s.pop(0))
运行结果为:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
['a', 'b', 'c']
a
b
Process finished with exit code 0
编写一个Python程序,解决约瑟夫环的问题。即,已知n个人(以编号1,2,3,……,n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人退出;他的下一个人又从1开始报数,数到k的那个人又退出;以此规律重复下去,直到圆桌周围的人只剩最后一个。
程序如下:
num=int(input('请输入参与的人数:'))
if num<0:
print('输入错误!')
exit(0)
name=[] #存放人名的列表,初值为空
for i in range(num):
name.append(input('请输入每个人的名字:'))
q=[] #q是模拟队列的列表,初值为空
for each in name:
q.append(each) #在列表的尾部入队
#在队列中,人数大于1时,按约瑟夫规则出队
while len(q)>1:
for i in range(num): #队头不报num,则出队后继续入队,模拟圆环
q.append(q.pop(0)) #队头元素出队,并入队尾
q.pop(0) #队头报num,该元素从队列中删除
print(q.pop(0)) #输出最后留下的人名
运行结果:
E:PycharmProjectsPythonTestvenvScriptspython.exe E:/PycharmProjects/PythonTest/ssss.py
请输入参与的人数:7
请输入每个人的名字:john
请输入每个人的名字:mike
请输入每个人的名字:mary
请输入每个人的名字:bill
请输入每个人的名字:gate
请输入每个人的名字:joe
请输入每个人的名字:kate
bill
Process finished with exit code 0
感觉这个书上的代码好像是有问题,可能是因为我对约瑟夫环问题理解不够透彻。我感觉k应该是用户输入的,而不是默认为num。但是抛开正确性,该代码的思路还是蛮好的。有大佬看到了欢迎来讨论啊啊啊啊,十分感谢!
最后
以上就是快乐烧鹅为你收集整理的Python入门之(4.1)列表的全部内容,希望文章能够帮你解决Python入门之(4.1)列表所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复