今日内容总结
字典相关操作
1.类型转换
dict()
字典的转换一般不使用关键字 而是自己动手转
2.字典必须要掌握的操作
user_dict = {
'username': 'jason',
'password': 123,
'hobby': ['read', 'music', 'run']
}
2.1按k取值(不推荐使用)
print(user_dict['username']) # jason
print(user_dict['phone']) # k不存在会直接报错
2.2按内置方法get取值(推荐使用)
print(user_dict.get('username')) # jason
print(user_dict.get('age')) # None
print(user_dict.get('username', '没有哟 嘿嘿嘿')) # jason 键存在的情况下获取对应的值
print(user_dict.get('phone', '没有哟 嘿嘿嘿')) # 键不存在默认返回None 可以通过第二个参数自定义
2.3修改值数据
print(id(user_dict))
user_dict['username'] = 'tony' # 键存在则修改对应的值
print(id(user_dict))
print(user_dict) # 不可变类型 值改变 内存地址不变
2.4新增键值对
user_dict['age'] = 18 # 键不存在则新增键值对
print(user_dict)
2.5删除数据
del user_dict['username'] # 删除usenrname的键值对
print(user_dict) # {'password': 123, 'hobby': ['read', 'music', 'run']}
res = user_dict.pop('password') # 弹出password的对值与res绑定
print(user_dict) # {'hobby': ['read', 'music', 'run']}
print(res) # 123
2.6统计字典中键值对的个数
print(len(user_dict)) # 3
2.7字典三剑客
print(user_dict.keys()) # 一次性获取字典所有的键 dict_keys(['username', 'password', 'hobby'])
print(user_dict.values()) # 一次性获取字典所有的值 dict_values(['jason', 123, ['read', 'music', 'run']])
print(user_dict.items()) # 一次性获取字典的键值对数据 dict_items([('username', 'jason'), ('password', 123), ('hobby', ['read', 'music', 'run'])])
for i in user_dict.items():
k, v = i
print(k, v)
补充说明
print(dict.fromkeys(['name', 'pwd', 'hobby'], 123)) # 快速生成值相同的字典
res = dict.fromkeys(['name', 'pwd', 'hobby'], [])
print(res) # {'name': [], 'pwd': [], 'hobby': []}
res['name'].append('jason')
res['pwd'].append(123)
res['hobby'].append('study')
print(res) # {'name': ['jason', 123, 'study'], 'pwd': ['jason', 123, 'study'], 'hobby': ['jason', 123, 'study']}
'''当第二个公共值是可变类型的时候 一定要注意 通过任何一个键修改都会影响所有'''
res = user_dict.setdefault('username','tony')
print(user_dict, res) # 键存在则不修改 结果是键对应的值
res = user_dict.setdefault('age',123)
print(user_dict, res) # 存不存在则新增键值对 结果是新增的值
user_dict.popitem() # 弹出键值对 后进先出
popitem() 方法返回并删除字典中的最后一对键和值。
如果字典已经为空,却调用了此方法,就报出 KeyError 异常
元组相关操作
1.类型转换
tuple()
ps:支持for循环的数据类型都可以转成元组
2.元组必须掌握的方法
t1 = (11, 22, 33, 44, 55, 66)
2.1索引取值
print(l1[2]) # 33
2.2切片操作
print(l1[2:4]) # (33, 44)
2.3间隔、方向
print(l1[0:5:2]) # (11, 33, 55)
2.4统计元组内数据值的个数
print(len(t1)) # 6
2.5统计元组内某个数据值出现的次数
print(t1.count(11))
2.6统计元组内指定数据值的索引值
print(t1.index(22))
2.7元组内如果只有一个数据值那么逗号不可少
2.8元组内索引绑定的内存地址不能被修改
2.9元组不能新增或删除数据
集合相关操作
1.类型转换
set()
集合内数据必须是不可变类型(整型 浮点型 字符串 元组)
集合内数据也是无序的 没有索引概念
2.集合需要掌握的方法
去重
关系运算
ps:只有遇到上述两种需求的时候才应该考虑使用集合
3.去重
s1 = {11, 22, 11, 22, 22, 11, 222, 11, 22, 33, 22}
l1 = [11, 22, 33, 22, 11, 22, 33, 22, 11, 22, 33, 22]
s1 = set(l1)
l1 = list(s1)
print(l1) # [33, 11, 22]
4.关系运算
群体直接做差异化校验
eg:两个微信账户直接 有不同的好友 有相同的好友
f1 = {'jason', 'tony', 'jerry', 'oscar'} # 用户1的好友列表
f2 = {'jack', 'jason', 'tom', 'tony'} # 用户2的好友列表
1.求两个人的共同好友
print(f1 & f2) # {'jason', 'tony'}
2.求用户1独有的好友
print(f1 - f2) # {'jerry', 'oscar'}
3.求两个人所有的好友
print(f1 | f2) # {'jason', 'jack', 'tom', 'tony', 'oscar', 'jerry'}
4.求两个人各自独有的好友
print(f1 ^ f2) # {'oscar', 'tom', 'jack', 'jerry'}
5.父集 子集
print(f1 > f2) # False
print(f1 < f2) # False
字符编码
理论
该知识点理论特别多 但是结论很少 代码使用也很短
1.字符编码只针对文本数据
2.回忆计算机内部存储数据的本质
3.既然计算机内部只认识01 为什么我们却可以敲出人类各式各样的字符
肯定存在一个数字跟字符的对应关系 存储该关系的地方称为>>>:字符编码本
4.字符编码发展史
4.1.一家独大
计算机是由美国人发明的 为了能够让计算机识别英文
需要发明一个数字跟英文字母的对应关系
ASCII码:记录了英文字母跟数字的对应关系
用8bit(1字节)来表示一个英文字符
4.2.群雄割据
中国人
GBK码:记录了英文、中文与数字的对应关系
用至少16bit(2字节)来表示一个中文字符
很多生僻字还需要使用更多的字节
英文还是用8bit(1字节)来表示
日本人
shift_JIS码:记录了英文、日文与数字的对应关系
韩国人
Euc_kr码:记录了英文、韩文与数字的对应关系
"""
每个国家的计算机使用的都是自己定制的编码本
不同国家的文本数据无法直接交互 会出现"乱码"
"""
4.3.天下一统
unicode万国码
兼容所有国家语言字符
起步就是两个字节来表示字符
utf系列:utf8 utf16 ...
专门用于优化unocide存储问题
英文还是采用一个字节 中文三个字节
字符编码实操
1.针对乱码不要慌 切换编码慢慢试即可
2.编码与解码
编码:将人类的字符按照指定的编码编码成计算机能够读懂的数据
字符串.encode()
解码:将计算机能够读懂的数据按照指定的编码解码成人能够读懂
bytes类型数据.decode()
3.python2与python3差异
python2默认的编码是ASCII
1.文件头
# encoding:utf8
2.字符串前面加u
u'你好啊'
python3默认的编码是utf系列(unicode)
作业
# 1.优化员工管理系统
# 输入1执行添加用户名功能
# 输入2执行查看所有用户名功能
# 输入3执行删除指定用户名功能
# '''分析 用户输入的不同 可以执行不同的代码'''
# ps: 思考如何让程序循环起来并且可以根据不同指令执行不同操作
# 提示: 循环结构 + 分支结构
# 拔高: 是否可以换成字典或者数据的嵌套使用完成更加完善的员工管理而不是简简单单的一个用户名
# 2.定义一个存储所有员工信息的字典
user_data_dict = {} # {'编号':用户字典, '编号':用户字典}
'''
数据存储的方式1
{
'jason':[18, 'teacher', 10],
'kevin':[28, 'sale', 90]
}
数据存储的方式2
{
'jason':{'age':18, 'job':'teacher', 'salary':8000},
'kevin':{'age':28, 'job':'sale', 'salary':9000}
}
数据存储的方式3
{
'1':{'name':'jason','age':18, 'job':'teacher', 'salary':8000},
'2':{'name':'kevin','age':28, 'job':'sale', 'salary':9000},
'3':{'name':'jason','age':18, 'job':'teacher', 'salary':8000},
'''
# 1.先搭建系统骨架
while True:
print("""
1.创建员工信息
2.查看单个员工
3.查看所有员工
4.修改员工薪资
5.删除员工信息
""")
choice = input('请选择您想要执行的功能编号>>>:').strip()
if choice == '1':
while True:
# 1.获取员工编号
emp_id = input('请输入该员工的员工编号(q)>>>:').strip()
if emp_id == 'q':
break
# 判断编号是否是纯数字
if not emp_id.isdigit():
print('员工编号必须是纯数字')
continue
# 2.判断员工编号是否已存在
if emp_id in user_data_dict:
print('员工编号已存在 请重新录入')
continue
# 3.获取员工详细信息
username = input('请输入员工姓名>>>:').strip()
age = input('请输入员工年龄>>>:').strip()
job = input('请输入员工岗位>>>:').strip()
salary = input('请输入员工薪资>>>:').strip()
# 4.构建一个临时的小字典
temp_dict = {}
# 5.添加员工信息键值对
temp_dict['emp_id'] = emp_id
temp_dict['name'] = username
temp_dict['age'] = age
temp_dict['job'] = job
temp_dict['salary'] = salary
# 6.添加到大字典中
user_data_dict[emp_id] = temp_dict
print(f'员工{username}添加成功')
elif choice == '2':
while True:
# 1.先获取员工编号
target_id = input('请输入您想要查看的员工编号(q)>>>:').strip()
if target_id == 'q':
break
# 2.判断员工编号是否不存在
if target_id not in user_data_dict:
print('员工编号不存在 无法查看')
continue
# 3.根据员工编号获取员工字典数据
user_dict = user_data_dict.get(target_id)
# 4.格式化输出
print(f"""
--------------info of emp-------------------
编号:{user_dict.get('emp_id')}
姓名:{user_dict.get('name')}
年龄:{user_dict.get('age')}
岗位:{user_dict.get('job')}
薪资:{user_dict.get('salary')}
--------------------------------------------
""")
elif choice == '3':
for user_dict in user_data_dict.values():
print(f"""
--------------info of emp-------------------
编号:{user_dict.get('emp_id')}
姓名:{user_dict.get('name')}
年龄:{user_dict.get('age')}
岗位:{user_dict.get('job')}
薪资:{user_dict.get('salary')}
--------------------------------------------
""")
elif choice == '4':
while True:
# 1.先获取想要修改的员工编号
target_id = input('请输入您想要修改的员工编号(q)>>>:').strip()
if target_id == 'q':
break
if target_id not in user_data_dict:
print('员工编号不存在')
continue
# 2.获取新的薪资
new_salary = input('请输入该员工的新薪资待遇>>>:').strip()
if not new_salary.isdigit():
print('薪资只能是纯数字')
continue
# 3.获取员工字典
user_dict = user_data_dict.get(target_id) # {'salary':123}
# 4.修改字典中的薪资
user_dict['salary'] = new_salary # {'salary': 321}
# 5.修改大字典
user_data_dict[target_id] = user_dict
print(user_data_dict.get(target_id))
elif choice == '5':
while True:
# 1.先获取想要修改的员工编号
target_id = input('请输入您想要删除的员工编号(q)>>>:').strip()
if target_id == 'q':
break
if target_id not in user_data_dict:
print('员工编号不存在')
continue
# 2.字典删除键值对
user_data_dict.pop(target_id)
else:
print('抱歉 暂无该功能编号!!!')
# 2.去重下列列表并保留数据值原来的顺序
# eg: [1,2,3,2,1] 去重之后 [1,2,3]
# l1 = [2,3,2,1,2,3,2,3,4,3,4,3,2,3,5,6,5]
l1 = [2, 3, 2, 1, 2, 3, 2, 3, 4, 3, 4, 3, 2, 3, 5, 6, 5]
l2 = []
for i in l1:
if i not in l2:
l2.append(i)
print(l2)
# 3.有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
# pythons={'jason','oscar','kevin','ricky','gangdan','biubiu'}
# linuxs={'kermit','tony','gangdan'}
# 1. 求出即报名python又报名linux课程的学员名字集合
# 2. 求出所有报名的学生名字集合
# 3. 求出只报名python课程的学员名字
# 4. 求出没有同时这两门课程的学员名字集合
pythons = {'jason', 'oscar', 'kevin', 'ricky', 'gangdan', 'biubiu'}
linuxs = {'kermit', 'tony', 'gangdan'}
print(pythons & linuxs)
print(pythons | linuxs)
print(pythons - linuxs)
print(pythons ^ linuxs)
# 4.统计列表中每个数据值出现的次数并组织成字典战士
# eg: l1 = ['jason','jason','kevin','oscar']
# 结果:{'jason':2,'kevin':1,'oscar':1}
# 真实数据
# l1 = ['jason','jason','kevin','oscar','kevin','tony','kevin']
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
d1 = {}
for i in l1:
if i not in d1:
d1[i] = l1.count(i)
print(d1)