6字典[python基础]
2019-12-21 本文已影响0人
乱弹琴给
什么是字典
字典(Dictionary)是Python中的内置数据结构
字典非常适合表达结构化数据
{
'姓名':'汪峰','性别':'男'
'绩效评级':'A','工资':'1000'
}
字典的特点
采用键(KEY):值(VALUE)形式表达数据
KEY不允许重复。
可以运行时修改,动态调整存储空间。
创建字典的两种方式
使用{}创建字典
dict1 = {} #空的字典
print(type(dict1))
dict2 = {'name':'汪峰' , 'sex':'男' , 'hiredate':'1997-10-20' ,
'grade':'A' , 'job':'销售' , 'salary':1000 ,
'welfare':100
}
使用dict函数创建字典
dict3 = dict(name='汪峰',sex='男'。。。。。)
dict4 = dict.fromkeys(['name' , 'sex' , 'hiredate' , 'grade'])
print(dict4)
{'name': None, 'sex':None ,'hiredate':None ,'grade':None}
如果写成
dict4 = dict.fromkeys(['name' , 'sex' , 'hiredate' , 'grade':'N/A'])
print(dict4)
默认值None会变成N/A
字典的取值操作
employee = {'name':'汪峰' , 'sex':'男' , 'hiredate':'1997-10-20' ,
'grade':'A' , 'job':'销售' , 'salary':1000 ,
'welfare':100
}
#字典的取值1
name = employee['name']
#字典的取值2
name = employee.get('name')
print(employee.get('dept' , '其他部门')) 如果没有字典中没有dept这个KEY,用get 可以使用设定的默认值‘其他部门’
#in 成员运算符
print('name' in employee) #TRUE
print('dept' in employee) #FALSE
# 遍历字典1
for key in employee:
v = employee[key]
print(v)
#遍历字典2
for k,v in employee:
print(k,v)
//会打印出所有键值对
字典的更新操作
employee = {'name':'汪峰' , 'sex':'男' , 'hiredate':'1997-10-20' ,
'grade':'A' , 'job':'销售' , 'salary':1000 ,
'welfare':100
}
对单个KV进行更新
employee['grade'] = 'B'
对多个KV进行更新
employee.update(salary = 1200,welfare = 150)
字典的新增操作与更新操作完全相同,有则更新,无则新增的原则。
employee['dept'] = '研发部'
employee.update(dept='财务部')
字典的删除操作
#1,pop 删除指定kv
employee.pop('dept')
#2,popitem 删除最后一个kv
kv = employee.popitem()
#3,clear 清空字典
employee.clear()
字典的常用操作
# 1,setdefault为字典设置默认值,如果某个KEY已经存在则忽略默认值,如果不存在则设置
emp1 = {'name':'jack' , 'grade':''B}
emp2 = {'name':'lily' }
emp2.setdefault('grade' ,'C') //比下面代码效率高
# if 'grade' not in emp2
# emp2['grade'] = 'C'
#2,获取字典的视图
#(1)KEYS 代表获取所有的键
ks = emp1.keys()
print(ks) //返回一个视图 dict_keys(['name','grade'])
#(2) values 代表获取所有的值
vs= emp1.values()
print(vs) //返回一个视图 dict_values
# (3)items 代表获取所有的键值对
its = emp1.items()
print(its) //返回一个视图 dict_items
视图会随着emp1原始数据的变化而动态变化。
# 3,利用字典格式化字符串
#老版本的字符串格式化
emp_str = "姓名:%(name)s,评级:%(grade)s,入职时间:%(hiredate) s" %emp1
#新版本
emp_str1 = "姓名:{name}, 评级:{grade}, 入职时间:{hiredate}".format_map(emp1)
# 散列值(HASH)
h1 = hash(“abc”)
print(h1)
hash散列值,接近唯一ID值
特点1,被hash的值有一点变化,生成的hash值就完全不同。
2,在同一次运行中,被hash的值相同,生成hash值就一定相同。
3,每运行一次,hash值就会重新生成一次。
#字典的存储原理
把KEY进行哈希运算,生成一个的哈希值作为内存地址,在这个地址中存储VALUE
效率高,建议结构化数据使用。
比如,name, hash(name) = 837181093 。 837181093这个内存中存储 “张三
#字典在项目中的应用
#两个独立系统之间进行数据传输,比如人力资源系统和财务系统,通过格式化的字 符串导入解析。
员工数据.TXT 7782,CLARK, MANAGER, SALES 5000$
7934, MILLER, SALESMAN, SALES, 3000$
7369, SMITH, ANALYST, RESEARCH, 2000
每一组用$分割
# 处理员工数据
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)) //range函数 range(start, stop[, step]) 创建一个整数列表,一般用在 for 循环中。
e = employee_list[i].split(",")
#创建员工字典
employee = {"no" : e[0], "name" : e[1], "job":e[2], "department" : e[3], "salary" : e[4]}
all_emp[employee['no']] = employee
#生成的数据形式{'7782' : {'no':'7782','name':'clark','job':'manager','department':'sales','salary':5000}, '7934'.........}
//这样可以通过get员工编号取得这个员工全部信息
empno = input("请输入员工编号:")
emp = all_emp.get(empno)
print("工号:{no},姓名:{name},岗位:{job},部门:{deparment},工资:{salary}".format_map(emp))