Python List、tuple和字典(3.9)

常用的列表方法及推导式

1.列表.clear() 清空列表(删除列表中的所有元素)

比直接赋空值效率高,

nums=[1,3,4,5,5]
nums.clear()
print(nums)

2.列表.copy() - 复制原列表产生一个一模一样的新列表,将新列表返回

变量保存数据其实是保存的数据在内存空间中的地址

将nums中的地址赋给nums1

nums1=[23,4,4,56,6]
nums2=nums1.copy()
# 对nums2进行改变,nums1不会改变
del nums2[-1]
print(nums1,nums2)
print('nums1({}):,nums2({})'.format(id(nums1),id(nums2)))
# 如果是赋值操作,原列表的值也会随之改变
nums3=[1,2,3,4]
nums4=nums3
print('nums3({}):,nums4({})'.format(id(nums3),id(nums4)))

其他类似的操作

列表[:],列表+[],列表*1的功能和列表.copy()的功能一模一样

3 .列表.count(元素 - )统计列表中指定元素的个数

nums5=[23,456,67,76,34,231,67,67]
print(nums5.count(67))  #3
print(nums5.count(888)) #没有就返回0

4.列表.extend(序列)- 将指定序列中的所有的元素全部添加到列表的后面

l1=[1,2]
l2=l1.copy()
l1.append('abc') #[1, 2, 'abc']
l2.extend('abc') #[1, 2, 'a', 'b', 'c']
print(l1,l2)
# print(l1.extend(3)) #不是序列会报错,'int' object is not iterable

5.列表.index - 获取指定元素在列表中的下标(下标是0开始增加的下标值)

同一元素有多个时,只返回第一个的下标值

元素不存在时,会报错

movies=['怦然心动','阿甘正传','绿皮书','肖生克的救赎','触不可及','阿甘正传','当幸福来敲门']
print(movies.index('触不可及')) #4
print(movies.index('阿甘正传')) #1
# print(movies.index('沉默的羔羊')) #ValueError: '沉默的羔羊' is not in list

6.列表.reverse() - 将原列表倒序

movies.reverse()
print(movies) #['当幸福来敲门', '阿甘正传', '触不可及', '肖生克的救赎', '绿皮书', '阿甘正传', '怦然心动']

7.列表.sort() - 直接修改原列表中元素的顺序,从小到大排序,不会产生新的列表

sorted.(列表),是返回一个新建立的有序列表,从小到大

nums6=[23,45,675,1,656,24,645]
print(sorted(nums6)) #[1, 23, 24, 45, 645, 656, 675]
nums6.sort()
print(nums6) #[1, 23, 24, 45, 645, 656, 675]
nums6.sort(reverse=True)
print(nums6) #[675, 656, 645, 45, 24, 23, 1]

元组

元组是容器型数据类型(序列),将()作为容器的标志,里面多个元素用逗号隔开:(元素### 1,元素2,…)

特点:元组是不可变的(不支持增删改)

元组是有序的(支持下标操作)

元素:任何类型的数据都可以作为元组的元素

2.元组就是不可变的列表 - 列表中除了增删改以外的操作都适用

2.1获取元素

t3=('绿色','黄色','粉色','红色','白色')
print(t3[1],t3[-4]) #黄色 黄色
print(t3[1:3]) #('黄色', '粉色')
print(t3[::-2]) #('白色', '粉色', '绿色')

for x in t3:
    print(x)
for index in range(len(t3)):
    print(index,t3[index])

2.2相关操作,相关函数

t3=('绿色','黄色','粉色','红色','白色')
print('黑色'in t3) #False
print('白色'in t3) #True

t4=(10,20)
t5=(100,200,300)
print(t4+t5)#(10, 20, 100, 200, 300)
print(t4*3)#(10, 20, 100, 200, 300)

print(max(t5))
print(min(t5))
print(sum(t5))
#可以排序,但是输出值是列表,想要元组再进行类型转换
new_nums=sorted((1,45,3,65,4))
print(new_nums)
print(tuple(new_nums))

3.元组的常用操作

3.1 只有一个元素的元组

t6=(1)
#元组只有一个元素,必须在唯一元素后添加逗号
t7=(1,)
print(t6,type(t6))# 1 <class 'int'>
print(t7,type(t7))#(1,) <class 'tuple'>

3.2在没有歧义的情况下,元组的小括号可以省略

直接将多个数据用逗号隔开,也表示一个元组

t8=(2,3,4,5)
t9=2,3,4,5
print(t8,type(t8)) # (2, 3, 4, 5) <class 'tuple'>
print(t9,type(t9)) # (2, 3, 4, 5) <class 'tuple'>

3.3 直接使用多个变量获取元组中的元素

1)让变量的个数和元组中的元素个数保持一致

subjects=('Python','Java','H5','UI')
x1,x2,x3,x4=subjects
print(x1,x2,x3,x4) # Python Java H5 UI

p1=(100,200)
x,y=p1
print(x,y) # 100 200

2)让变量的个数小于元组中元素的个数,并且在其中的一个变量前加*

获取的时候先让不带的变量按位置获取对应元素,剩下的全部给有

student=('小明',18,89,78,23,8,'男')
name,*others,sex=student
print(name,sex) #小明 男
print(others) #[18, 89, 78, 23, 8]

name,age,*s,sex=student
print(name,age,sex)
print(*s) #89 78 23 8
print(s) #[89, 78, 23, 8]

4.元组相关的方法

1)元组.count(元素) - 统计元组中指定元素的个数

2)元组.index(元素) - 获取指定元素对应的下标,有多个,只返回第一个

字典

1.什么是字典(dict)

字典是容器型数据类型(序列);将{}作为容器的标志,里面多个元素用逗号隔开,

每个元素都是键值对:{键1:值1,键2:值2,…}

字典是可变的(支持增删改);

字典是无序的(不支持下标操作)

字典真正想要保存的其实是值,键是用来对值进行区分和说明

元素:字典的一个元素是一个键值对

键 - 必须是不可变类型的数据(数字,字符串和元组),但一般使用字符串;

键是惟一的

值 - 可以是任何类型的数据

# 键是不可变的数据
d2={'a':10,10:20,(10,20):30}
# d2={'a':10,10:20,[10,20]:30} #列表不能作为键,TypeError: unhashable type: 'list'
print(d2)
# 键是唯一的
d4={'a':10,'b':20,'a':30}
print(d4) #{'a': 30, 'b': 20}
# 字典是无序的
print({'a': 30, 'b': 20}=={'b': 20, 'a': 10}) # False

2.增删改查

2.1 查 - 获取字典中某个元素的值

1)查单个(只能通过键找值)

字典[key] - 获取字典中指定key对应的值

字典.get(key) - 获取字典中指定key对应的值,key不存在返回None

字典.get(key,默认值) - 获取字典中指定key对应的值,key不存在返回默认值

student={'name':'小明','age':30,'gender':'男','height':175,'weight':73,'grade':65}
print(student['gender']) #男
print(student['weight']) #73
# 如果key不存在会报错
# print(student['score']) #KeyError: 'score'

print(student.get('height')) #173
print(student.get('score')) #None
print(student.get('score',0)) #0

2)遍历

for 变量 in 字典:

循环体

:注意,变量依次取到的值键

for x in student:
    print('x:',x,student[x])

作业

1.创建一个列表,列表中有10个舒宗, 保证列表中元素的顺序,对列表进行排重,并对列表使用进行降序排序

例如:随机生成了[70, 88, 91, 70, 107, 234, 91, 177, 282, 197]
		--- 去重之后 [70, 88, 91, 107, 234, 177, 282, 197]
  	---- 降序排序 [282, 234, 197, 177, 107, 91, 88, 70]
from random import randint
def alone_sort():
    #随机生成列表并打印
    num=int(input('您想生成几个数的随机列表(请输入):'))
    new_list=[]
    for _ in range(num):
        new_list.append(randint(0,200))
    print('随机生成的列表为:{}'.format(new_list))
    #去重和降序
    for _ in range(num):
        item=new_list.pop()
        if item not in new_list:
            new_list.insert(0,item)
    print('去重后的列表为:{}'.format(new_list))
    print('进行降序后的列表为:{}'.format(sorted(new_list,reverse=True)))

alone_sort()

方法二:

def alone_sort2():
    #随机生成列表并打印
    n = int(input('您想生成几个数的随机列表(请输入):'))
    nums=[randint(0,200) for x in range(n)]
    print('随机生成的列表为:{}'.format(nums))
    #去重和降序
    new_list=[]
    for x in nums:
        if x not in new_list:
            new_list.append(x)
    print('去重后的列表为:{}'.format(new_list))
    print('进行降序后的列表为:{}'.format(sorted(new_list,reverse=True)))

alone_sort2()

结果:
在这里插入图片描述

2.利用列表推导式, 完成以下需求

a. 生成一个存放1-100中个位数为3的数据列表

结果为 [3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
list1=[x+10 for x in range(-7,84,10)]
list2=[x for x in range(3,94,10)]
print(list1)
print(list2)

结果:
在这里插入图片描述

b. 利用列表推到是将 列表中的整数提取出来

例如:[True, 17, "hello", "bye", 98, 34, 21] --- [17, 98, 34, 21]
list3=[True, 17, "hello", "bye", 98, 34, 21]
new_list=[x for x in list3 if type(x)==int]
#str.isdigit() 
#new_list2=[x for x in list3 if x.isdigit()]
print(new_list)

结果:
在这里插入图片描述

c.利用列表推导式 存放指定列表中字符串的长度

例如 ["good", "nice", "see you", "bye"] --- [4, 4, 7, 3]
list4=["good", "nice", "see you", "bye"]
new_list=[len(x) for x in list4]
print(new_list)

结果:
在这里插入图片描述

3.已知代码如下,请回答出各个print的结果 并说明原因


nums = [17, 39, 28, 51]
nums2 = nums
nums2.pop()
print(len(nums)) # 这个结果是什么   请描述原因

结果:3  
原因:直接赋值nums2的地址空间和nums一样,执行nums2.pop()时,nums也会进行同样的变化

numlist = [17, 22, 39, 58, [55, 43]]
nums3 = numlist.copy()
print(numlist is nums3) # 结果  原因是什么
numlist[-1][0] = 99
print(nums3) # num3会不会发生变化

结果:False
	 [17, 22, 39, 58, [99, 43]]
     
原因:->nums3是通过copy()方法建立的新列表,序列地址空间与原序列不相同,所以输出结果为False;
	  ->会发生变化,因为是浅拷贝(列表中的列表地址和原来的一样),想要不变化,用deepcopy()方法

补充:

is - 判断两个数据的地址是否相等

4.定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )
a.统计不及格学生的个数
b.打印不及格学生的名字和对应的成绩
c.统计未成年学生的个数
d.打印手机尾号是8的学生的名字
e.打印最高分和对应的学生的名字

​ f.删除性别不明的所有学生

​ g.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)

student=[
    {'姓名':'二狗子','年龄':28,'成绩':99,'电话':'12377770008','性别':'不明'},
    {'姓名':'三娃子','年龄':8,'成绩':3,'电话':'12377770009','性别':'女'},
    {'姓名':'水娃','年龄':5,'成绩':4,'电话':'12377771008','性别':'男'},
    {'姓名':'火娃','年龄':6,'成绩':13,'电话':'12377772008','性别':'男'},
    {'姓名':'皮卡丘','年龄':10,'成绩':999,'电话':'12377770007','性别':'不明'},
    {'姓名':'神童','年龄':2,'成绩':999,'电话':'12377770000','性别':'女'}
]
count_grade=0
count_yong=0
max1=0
for x in student:
    #先把需要用到的取出来,后面再用到就不用取了
    name=x['姓名']
    score=x['成绩']
    age=x['年龄']
    tel=x['电话']
    if score<60:
        count_grade+=1
        print(name,':',score,'(不及格)')
        # print('{}:{}(不及格)'.format(x['姓名']),x['成绩'])
    if age<18:
        count_yong+=1
    # if int(tel[-1])%10==8: #转换成整型取余判断也可以
    if list(tel)[-1]=='8':
        print(name,'的手机尾号是8')
        # print('{}的手机尾号是8'.format(x['姓名']))
    if score>max1:
        max1=score
print('有{}个同学不及格'.format(count_grade))
print('有{}个同学未成年'.format(count_yong))
#打印最高分的学生
#自己写逻辑判断
n=len(student)
for x in student:
    score=x['成绩']
    name = x['姓名']
    if score==max1:
        print(name,'获得了最高分')
        # print('{}获得了最高分'.format(i['姓名']))
new_list=[]
for i in range(n):
    #1.直接用del 或者remove() ,n也会相应减少,不好操作
    # if student[i]['性别']=='不明':
        # del student[i]
    #2.自己写逻辑
    if student[i]['性别']!='不明':
        new_list.append(student[i])
print('========================')
for x in new_list:
    print(x)
#从大到小排序(冒泡)
# 1,自己写排序
n=len(student)
for i in range(n):
    for j in range(n-i-1):
        if student[j]['成绩']<student[j+1]['成绩']:
            student[j],student[j+1]=student[j+1],student[j]
print('====================')
for x in student:
    print(x)

结果:

法二:(对法一的优化)

student=[
    {'姓名':'二狗子','年龄':28,'成绩':99,'电话':'12377770008','性别':'不明'},
    {'姓名':'三娃子','年龄':8,'成绩':3,'电话':'12377770009','性别':'女'},
    {'姓名':'水娃','年龄':5,'成绩':4,'电话':'12377771008','性别':'男'},
    {'姓名':'火娃','年龄':6,'成绩':13,'电话':'12377772008','性别':'男'},
    {'姓名':'皮卡丘','年龄':10,'成绩':999,'电话':'12377770007','性别':'不明'},
    {'姓名':'神童','年龄':2,'成绩':999,'电话':'12377770000','性别':'女'}
]
count_grade=0
count_yong=0
for x in student:
    #先把需要用到的取出来,后面再用到就不用取了
    name=x['姓名']
    score=x['成绩']
    age=x['年龄']
    tel=x['电话']
    if score<60:
        count_grade+=1
        print(name,':',score,'(不及格)')
        # print('{}:{}(不及格)'.format(x['姓名']),x['成绩'])
    if age<18:
        count_yong+=1
    # if int(tel[-1])%10==8: #转换成整型取余判断也可以
    if list(tel)[-1]=='8':
        print(name,'的手机尾号是8')
        # print('{}的手机尾号是8'.format(x['姓名']))
print('有{}个同学不及格'.format(count_grade))
print('有{}个同学未成年'.format(count_yong))
#打印最高分的学生
#用推导式做
max2=max([stu['成绩'] for stu in student])
names=[stu['姓名'] for stu in student if stu['成绩']==max2]
print('最高分的学生有:',names)
#筛选符合条件的列表元素(字典),组成新的列表并输出
new_list=[stu for stu in student if stu['性别']!='不明']
print('========================')
#一个一个输出方便控制台查看
for x in new_list:
    print(x)
#成绩从大到小排序
student.sort(key=lambda item:item['成绩'],reverse=True)
print('====================')
for x in student:
    print(x)

结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值