Day11 列表,字典,元组,集合的内置类型方法
1、可变与不可变类型
- 可变与不可变的类型指的是这个数据类型在做内置方法后,内存地址是否可以不变
可变类型
list dict set s1={1,2,5} s2={4,6,11} print(id(s1)) s1.update(s2) print(id(s1),s1) >>> 2029124058696 2029124058696 {1, 2, 4, 5, 6, 11}
不可变类型
str int float tuple bool 不可变类型中 有个特里 元组 当元组内存在列表时,因为列表时可变的,所以当通过索引修改元组内的列表内的值时,是可以成功修改的 而且元组的内存地址不会发生改变。 t1=(1, 2, 'nihao', {1, 2, 3}) s2 = {4, 6, 11} print(id(t1)) t1[3].update(s2) print(id(t1), t1) >>> 2465055699096 2465055699096 (1, 2, 'nihao', {1, 2, 3, 4, 6, 11})
2、列表的内置方法
- 列表是一个有序的可变的,所以列表在调用内置方法时不会产生新的值,而是直接修改自身
2.1、列表增加数据值
append 增加列表元素
l1=[1,'jack','坤坤'] l1.append(3) print(l1) [1, 'jack', '坤坤', 3] l1.append([1,2,'jack']) print(l1) [1, 'jack', '坤坤', 3, [1, 2, 'jack']]
insert 在索引位置插入数据
l1=[1,'jack','坤坤'] l1.insert(1,'宁浩') print(l1) >>>[1, '宁浩', 'jack', '坤坤']
extend 扩展,将数据以for循环形式一个添加到列表中
l1=[1,'jack','坤坤'] l2=[2,5,8,] l1.extend(l2) print(l1) >>>[1, 'jack', '坤坤', 2, 5, 8]
2.2、列表删除数据值
del 通用删除
l1=[1,'jack','坤坤'] del l1[1] print(l1) >>>[1, '坤坤']
remove 指名道姓删除
l1=[1,'jack','坤坤'] l1.remove('坤坤') print(l1) >>>[1, 'jack']
pop 弹出删除
l1=[1,'jack','坤坤'] print(l1.pop()) >>>坤坤
2.2、列表改数据值
直接通过索引修改
l1=[1,'jack','坤坤'] l1[0]=123 print(l1) >>>[123, 'jack', '坤坤']
2.3、列表查数据
直接通过索引查看数据
l1=[1,'jack','坤坤','宁浩',521] print(l1) print(l1[0:2]) >>> [1,'jack','坤坤','宁浩',521] [1, 'jack']
2.4、通过元素查看对应索引值 index
l1=[1,'jack','坤坤','宁浩',521] print(l1.index('jack')) >>>1
2.5、统计元素出现的次数 count
l1=[1,'jack','jacon','jack','jack'] print(l1.count('jack')) >>>3
2.6、将列表升序,降序 sort
.sort()升序
这里需要注意的是列表可变,排序是直接改变原列表的顺序
l2=[1,5,6,4,2] print(l2.sort(),l2) >>> None [1, 2, 4, 5, 6]
.sort(reverse=True) 降序
l2=[1,5,6,4,2] l2.sort(reverse=True) print(l2) >>> [6, 5, 4, 2, 1]
2.7、翻转 前后颠倒 reverse
l2=[1,5,6,4,2] l2.reverse() print(l2) >>> [2, 4, 6, 5, 1]
2.9、比较运算
同数字比较
l2=[1,5,6,4,2] l3=[2,4,5,6] print(l3>l2) >>>True
字符比较按着Ascii码的前后顺序比较
不同的数据类型无法比较
3、元组的内置方法
- 支持for循环的的数据类型都可以转为化为元组
- 元组只可以查但不能改。
- 当元组内只有一个元素时逗号不能省略,不然会转为别的数据类型
- 元组内的元素不可改绑地址,也因此元组时不可变类型
4、字典的内置方法
- 字典是无序的可变类型数据,字典可以直观的存储信息
4.1、类型转换
字典涉及的类型转换很少
s1=(['name','jack'],['age',18]) print(dict(s1)) d1=dict(name='jack',age='18') print(d1) >>> {'name': 'jack', 'age': 18} {'name': 'jack', 'age': '18'}
key 一般是字符串,k其实只要是不可变类型的都可以作为键
4.2、内置方法
取值操作
print(dict_1['name']) #不推荐使用,键不存在会报错 print(dict_1.get('name','这个参数当键不存在时会返回')) #键不存在时没有第二个参数默认返回None
4.3、统计字典中键值对 len
通用方法统计元素个数 len()
print(len(dact_1))
4.4、修改和新增元素数据
修改元素数据,如果键不存在则会自动添加次键值对
dict_1['gender']='男'
4.5、删除数据 del
删除方法有通用的del 和pop方法 还有popitem随机删除法
del ditc_1['name'] 删除指定键值对 name_item=dict_1.pop('namee') 弹出指定键值,并且可以利用变量获取弹出的值,进行利用 dict_1.popitem() #随机弹出,并且也可对其弹出的值赋给变量,加以利用
4.6、获取键,值与键值对数据 keys,values,items
获取键
print(dict_1.keys()) # 获取字典中的键, dict_keys(['name', 'age', 'gender'])
获取键值
print(dict_1.values()) # 获取字典中的键值 dict_keys(['jack', '18', '男'])
获取键值对
print(dict_1.items()) # 获取字典中的键值对 dict_items([('name','jack'),('age','18'),('gender','男')])
4.7、快速创建字典键
这个快速创建的字典 键值都是取自同一个内存地址,所以之后使用都需要重新修改键值
dict_1=dict.fromakeys(['name','age','gender'],[]) # 这里键值都是一个[],之后修改了空列表里的元素,那么三个键将一起修改 # 解决办法是将之后使用键时重新绑定键值 dict_1['name']=[] dict_['age']=[] dict_1['gender']=[]
4.8、获取键只方法二
键存在则返回键值,键不存在则返回第二个参数,并且他会直接会将不存在的键与第二个参数直接组成键值对添加到字典中,这也是与get最主要的区别
dict_1={'name': 'jack', 'age': '18', 'gender': '男'} print(dict_1.setdefault('name','18')) >>>jack print(dict_1.setdefault('salars','18')) print(dict_1) >>> 18 {'name': 'jack', 'age': '18', 'gender': '男', 'salars': '18'}
5、集合的内置方法
- 支持for循环的且必须时不可变的数据类型 可以转换为集合
- 集合的主要用途就是去重,以及关系运算
去重
s1 = {1, 2, 2, 3, 2, 3, 2, 3,5,4, 2, 3, 4, 4, 5, 4, 5, 4} print(s1) >>>{1, 2, 3, 4, 5}
5.2、关系运算
求两个集合的共同值(共同好友) s1={'jack','kk','tony','红红','tt','vv'} s2={'kk','红红','tt','jj'} print(s1&s2) >>>{'kk', 'tt', '红红'} 求s1独有的好友 print(s1-s2) >>>{'vv', 'jack', 'tony'} 求s2独有的好友 print(s2-s1) >>>{'jj'} 求s1和s2独有的好友 print(s1^s2) >>>{'vv', 'jack', 'jj', 'tony'} 求s2 s1 所有的好友 print(s1|s2) >>>{'tt', 'jack', 'kk', 'jj', 'vv', '红红', 'tony'}
5.3、父级,子集
s1={'jack','kk','tony','红红','tt','vv'} s2={'kk','红红','tt',} print(s1>s2) print(s1<s2) >>> True False
作业
1.利用列表编写一个员工姓名管理系统
输入1执行添加用户名功能
输入2执行查看所有用户名功能
输入3执行删除指定用户名功能
拔高: 是否可以换成字典或者数据的嵌套使用完成更加完善的员工管理而不是简简单单的一个用户名(能写就写 不会没有关系)
function='1.添加用户\n2.查看所有用户\n3.删除用户\n4.退出系统\n请输入:'
user_data={'001':{'name':'测试','age':'22','gender':'男','salary':'100'}}
while True:
data=input(function) # 菜单栏打 输入功能选项
if data=='1' :
print('用户录入'.center(40,'-'))
while True:
user_info_data={} # 创建空字典 收集输入的信息
user_id=input('请输入编号(0xx)')
if user_id in user_data: # 判断编号是否唯一 ,防止之后功能冲突
print('账号已存在')
continue #若存在 重新启用功能循环
user_data[user_id]=user_info_data
user_name=input('请输入员工姓名')
user_info_data['name'] = user_name
user_age=input('请输入员工年龄')
user_info_data['age'] = user_age
user_gender=input('请输入员工性别')
user_info_data['gender'] = user_gender
user_salary=input('请输入员工薪资')
user_info_data['salary'] = user_salary
print(user_data[user_id]) #显示存入的数据
print('录入成功'.center(40,'-'))
break
continue
elif data=='3':
print('员工信息删除'.center(40,'-'))
while True:
user_id=input('请输入要删除的员工编号:')
if user_id in user_data: # 先判断字典表中有无这编号
print(user_data.get(user_id)) # 打印信息后在给管理员确认
if input('确认删除请按任意键,返回请按0')!='0': # 二次确认判断
del user_data[user_id] # 删除此员工信息字典
print('删除成功'.center(40,'-'))
break # 删除后直接退出此功能循环
else:
break # 若不删除也退出此功能循环
else:
print('无此编号')
continue # 无此编号 重启循环重新输入
continue
elif data=='2':
for item in user_data: # 先循环取得员工编号 方便后续格式化输出
user_info_data=user_data.get(item) # 通过编号取员工信息
print(f'{user_info_data["name"]}员工信息'.center(40,'-'), #加个横栏 好看
f'\n员工编号:{item}\n员工姓名:{user_info_data["name"]}\n员工年龄:{user_info_data["age"]}\n员工性别:{user_info_data["gender"]}\n员工薪资:{user_info_data["salary"]}k')
else:
print('end'.center(40,'-'))
continue
else: # 这里键都退出系统
print('退出系统成功')
break
2.去重下列列表并保留数据值原来的顺序
l1 = [2,3,2,1,2,3,2,3,4,3,4,3,2,3,5,6,5]
l2=[] # 创建空列表
for i in l1: # 循环从l1取值
if i not in l2: # 如果 值不再l2中那么直接添加进去
l2.append(i) #利用尾部添加,依据循环顺序,顺序不会改变
print(l2)
>>>
[2, 3, 1, 4, 5, 6]
3.有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
1.求出即报名python又报名linux课程的学员名字集合
print(f'又报名python又报名linux的学生有{all_name}')
>>>又报名python又报名linux的学生有{'gangdan'}
2.求出所有报名的学生名字集合
print(pythons|linuxs)
>>>{'kevin', 'jason', 'tony', 'kermit', 'oscar', 'gangdan', 'biubiu', 'ricky'}
3.求出只报名python课程的学员名字
print(pythons-linuxs)
>>>{'kevin', 'jason', 'oscar', 'biubiu', 'ricky'}
4.求出没有同时这两门课程的学员名字集合
print(pythons^linuxs)
>>>{'kevin', 'tony', 'kermit', 'jason', 'oscar', 'biubiu', 'ricky'}