Python之字典
咱们目前已经学习到的容器型数据类型只有list,那么list够用?他有什么缺点呢?
- 1. 列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢。
- 2. 列表只能按照顺序存储,数据与数据之间关联性不强。
- 3.列表在表达结构化数据时语义不明确,结构化数据是指有明确属性,明确表示规则的数据。
所以针对于上的缺点,所以需要引入另一种容器型的数据类型,解决上面的问题,就是dict字典。
- 不可变(可哈希)的数据类型:int,str,bool,tuple。
- 可变(不可哈希)的数据类型:list,dict,set。
- 在Python3.5版本(包括此版本)之前,字典是无序的。
- 在Python3.6版本之后,字典会按照初建字典时的顺序排列(即第一次插入数据的顺序排序)。
当然,字典也有缺点:他的缺点就是内存消耗巨大。
在习惯上:
- 列表更适合保存多个商品、多个姓名、多个时间,这样的相似数据;
- 字典更适合保存一个商品的不同信息、一个人的不同信息,这样的不同数据。
1.创建字典
1.1.使用{}
dict1 = {} # 空的字典 print(type(dict1)) dict2 = {'name': '王峰', 'sex': "男", 'hiredate': '1997-10-20', 'grade': 'A', 'job': '销售', 'salary': 1000, 'welfare': 100 } print(dict2)
1.2.利用dict函数创建字典
dict3 = dict(name='王峰', sex='男', hiredate='1997-10-20') print(dict3) # {'name': '王峰', 'sex': '男', 'hiredate': '1997-10-20'} dict4 = dict.fromkeys(['name', 'sex', 'hiredate', 'grade'], 'N/A') print(dict4) # {'name': 'N/A', 'sex': 'N/A', 'hiredate': 'N/A', 'grade': 'N/A'}
注:字典由多个键及对应的值组成,键和值使用冒号分割,字典中键的值必须唯一,而值不需要,另外,字典中的键必须是不可变的,如:字符串,元组和数字。
2.字典取值
employee = {'name': '王峰', 'sex': "男",
'hiredate': '1997-10-20', 'grade': 'A',
'job': '销售', 'salary': 1000,
'welfare': 100
}
# 字典的取值
name = employee['name'] # 如果查找的key不存在,会直接报错
print(name)
salary = employee['salary']
print(salary)
print(employee.get('job')) # 使用字典的get方法,如果key不存在,会默认返回None,而不报错
print(employee.get('dept' , '其他部门')) # 如果根据key获取不到value,使用给定的默认值
3.in 成员运算符
employee = {'name': '王峰', 'sex': "男",
'hiredate': '1997-10-20', 'grade': 'A',
'job': '销售', 'salary': 1000,
'welfare': 100
}
print('name'in employee) # in运算符,如果直接用在字典上,是用来判断key是否存在,而不是value
print('dept' not in employee)
4.遍历字典
# 第一种遍历方式:直接for...in循环字典 for key in employee: v = employee[key] print(v) # 第二种方式 for k,v in employee.items(): print(k,v)
5.字典的更新和新增
employee = {'name': '王峰',
'sex': "男",
'hiredate': '1997-10-20',
'grade': 'A',
'job': '销售',
'salary': 1000,
'welfare': 100
}
print(employee)
#单个kv进行更新
employee['grade'] = 'B'
print(employee)
#对多个kv进行更新
employee.update(salary = 1200, welfare=150)
print(employee)
# 字典的新增操作与更新操作完全相同,秉承有则更新,无则新增的原则
employee['dept'] = '研发部'
print(employee)
employee['dept'] = '市场部'
print(employee)
employee.update(weight=80,dept='财务部') # 合并两个字典,字典不支持+
print(employee)
6.删除字典
删除字典可以删除对应的键值对,也可以删除整个字典。
employee = {'name': '王峰', 'sex': "男",
'hiredate': '1997-10-20', 'grade': 'A',
'job': '销售', 'salary': 1000,
'welfare': 100
}
# 1. pop 删除指定的kv,执行结果是被删除的value
employee.pop('weight')
print(employee)
# 2.popitem 删除最后一个kv,结果是被删除的这个元素组成的键值对
kv = employee.popitem()
kv = employee.popitem()
print(kv)
print(employee)
# 3. clear 清空字典
employee.clear()
print(employee)
7.为字典设置默认值
emp1 = {'name':'Jacky' , 'grade' : 'B'}
emp2 = {'name':'Lily' , 'grade' : 'A'}
# 1. setdefault为字典设置默认值,如果某个key已存在则忽略,如果不存在则设置
emp1.setdefault('grade' , 'C')
emp2.setdefault('grade' , 'C')
#if 'grade' not in emp2:
# emp2['grade'] = 'C'
print(emp2)
8.字典的视图
emp1 = {'name':'Jacky' , 'grade' : 'B'}
emp2 = {'name':'Lily' , 'grade' : 'A'}
ks = emp1.keys()
print(ks)
print(type(ks))
# (2) values 代表获取所有的值
vs = emp1.values()
print(vs)
print(type(vs))
# (3) items 代表获取所有的键值对
its = emp1.items()
print(its)
print(type(its))
emp1['hiredate'] = '1984-05-30'
print(ks)
print(vs)
print(its)
9.利用字典格式化字符串
# 老版本的字符串格式化 emp_str = "姓名:%(name)s,评级:%(grade)s,入职时间:%(hiredate)s" %emp1 print(emp_str) # 新版本的字符串格式化 emp_str1 = "姓名:{name},评级:{grade},入职时间:{hiredate}".format_map(emp1) print(emp_str1)
10.字典推导式
dict1 = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
dict2 = {}
for k, v in dict1.items():
dict2[v] = k
# dict1 = dict2
# print(dict1)
dict1 = {v: k for k, v in dict1.items()}
print(dict1) # {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
11.散列值(Hash)
字典也称为“哈希(Hash)”,对应“散列值”,是从任何一种数据中创建数字“指纹”,Python中提供了hash()生成散列值。

# 散列值 hash() h1 = hash("abc") print(h1) h2 = hash("bcd") print(h2) h3 = hash(8838183) print(h3) h4 = hash("abc") h5 = hash("def") print(h4) print(h5)
12.字典在项目中的应用
# 处理员工数据 source = "7782,CLARK,MANAGER,SALES,5000$7934,MILLER,SALESMAN,SALES,3000$7369,SMITH,ANALYST,RESEARCH,2000" employee_list = source.split("$") print(employee_list) # 保存所有解析后的员工信息,key是员工编号,value则是包含完整员工信息的字典 all_emp = {} for i in range(0,len(employee_list)): #print(i) e = employee_list[i].split(",") print(e) # 创建员工字典 employee = {"no" : e[0],'name':e[1],'job':e[2],'department':e[3],'salary':e[4]} print(employee) all_emp[employee['no']] = employee print(all_emp) empno = input("请输入员工编号:") emp = all_emp.get(empno) if empno in all_emp: print("工号:{no},姓名:{name},岗位:{job},部门:{department},工资:{salary}".format_map(emp)) else: print("员工信息不存在")
13.字典的其他说明
a)字典和列表的区别
- 字典的特点:查找和插入的速度非常快,但是需要占用大量内存,内存浪费较多。
- 列表的特点:查找和插入的速度随着元素的增加而减慢,占用空间小。

浙公网安备 33010602011771号