Python入门之(4.1)列表

目录

列表

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:\PycharmProjects\PythonTest\venv\Scripts\python.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取值不同时的切片含义如下表所示:

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:\PycharmProjects\PythonTest\venv\Scripts\python.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 x1 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']对原列表排序

注意:

  1. 列表在执行了del()方法或者remove()方法之后,列表中被删除元素之后的其他元素会依次向前移动一个位置;
  2. 列表在执行了insert()方法之后,列表中大于等于给定索引位置的所有元素会依次向后移动一个位置。新增加的元素添加在index所指示的位置;
  3. 使用append()方法时,如果参数也是一个列表对象,要添加的列表对象会作为一个单独的元素来处理,即相当于一个嵌套列表;例如:t=['a','b','c','d']          t.append(['e','f']) 运行结果是['a','b','c','d',['e','f']]
  4. 如果只是想合并两个列表,不想得到上述嵌套的列表,不适用append()方法,而采用extend()方法;
  5. 列表使用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:\PycharmProjects\PythonTest\venv\Scripts\python.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:\PycharmProjects\PythonTest\venv\Scripts\python.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('\t\t学生系统管理')
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:\PycharmProjects\PythonTest\venv\Scripts\python.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:\PycharmProjects\PythonTest\venv\Scripts\python.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
  1. 第12行代码有问题吧?是要按列遍历矩阵,但是12行的意思是输出第2列?Ans:把第10行中的row换成col并不是按列遍历矩阵,还是按行遍历,二者结果是一样的。如果把第12行代码修改一下改成输出是按列遍历的话,可能就改得和第17行代码差不多了
  2. 第15行没怎么看懂?Ans:详见https://blog.csdn.net/Tyro_java/article/details/81638557
  3. row和col是Python已经定义好的?Ans:好像是的,因为在输入row的时候,还没输入完编辑器就会提示row了,和用户定义的普通变量不太一样,但是又没找到官方解释,先记下来,以后再说
  4. 如果把第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:\PycharmProjects\PythonTest\venv\Scripts\python.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:\PycharmProjects\PythonTest\venv\Scripts\python.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:\PycharmProjects\PythonTest\venv\Scripts\python.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:\PycharmProjects\PythonTest\venv\Scripts\python.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:\PycharmProjects\PythonTest\venv\Scripts\python.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:\PycharmProjects\PythonTest\venv\Scripts\python.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:\PycharmProjects\PythonTest\venv\Scripts\python.exe E:/PycharmProjects/PythonTest/ssss.py
请输入参与的人数:7
请输入每个人的名字:john
请输入每个人的名字:mike
请输入每个人的名字:mary
请输入每个人的名字:bill
请输入每个人的名字:gate
请输入每个人的名字:joe
请输入每个人的名字:kate
bill

Process finished with exit code 0

感觉这个书上的代码好像是有问题,可能是因为我对约瑟夫环问题理解不够透彻。我感觉k应该是用户输入的,而不是默认为num。但是抛开正确性,该代码的思路还是蛮好的。有大佬看到了欢迎来讨论啊啊啊啊,十分感谢!

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值