文章目录

  • 一、特点
  • 二、创建方式
  • 三、字典取值
  • 四、遍历字典
  • 五、方法
  • 六、 散列值(Hash)
  • 七、Dictionary在项目中的应用(存放员工信息)

一、特点

  1. 采用键值对的形式记录数据,key建议使用英文
  2. key不允许重复,value可以重复
  3. 字典是可以修改的,运行时动态调整存储空间

二、创建方式

  1. 使用{}创建
# 1.使用{}
dic1 = {} # 空的字典
print(type(dic1)) # 输出:<class 'dict'>

dic2 = {
            'name':'王峰',
            'sex':'男',
            'hiredate':'1997-2-2',
            'salary':'2000',
            'job':'销售'
        }
print(dic2)
# 输出:{'name': '王峰', 'sex': '男', 'hiredate': '1997-2-2', 'salary': '2000', 'job': '销售'}
  1. 使用dic函数创建
# 2.使用dict函数创建字典:key不用单引号引起来,默认为字符串类型
dic3 = dict(name = '王峰',sex = '男',hiredate = '1997-2-2')
print(dic3)
# 输出:{'name': '王峰', 'sex': '男', 'hiredate': '1997-2-2'}

# dict函数利用一个序列来创建对应的key值
# 默认值为none
dic4 = dict.fromkeys(['name','sex','hiredate'])
print(dic4)
# 输出:{'name': None, 'sex': None, 'hiredate': None}

# 改变默认值
dic5 = dict.fromkeys(['name','sex','hiredate'],0)
print(dic5)
# 输出:{'name': 0, 'sex': 0, 'hiredate': 0}

三、字典取值

# 字典的取值
employee = {
            'name':'王峰',
            'sex':'男',
            'hiredate':'1997-2-2',
            'salary':'2000',
            'job':'销售'
        }
  1. 通过key值取值
# 1.通过key值取值
name = employee['name']
print(name) # 输出:王峰
  1. 通过get函数取值
# 2.通过get函数取值
job = employee.get('job')
print(job) # 输出:销售
  1. 以上两种的区别
# 以上两种的区别,若key值不存在,使用第一种方法会报错,第二种直接输出:None(默认)也可自己定义
#print(employee['dept'])  #程序报错
print(employee.get('dept','不存在')) # 输出:不存在
  1. 判断key值是否在字典中
# in,not in成员运算符:判断目标key是否存在于字典中
print('name' in employee) # 输出True
print('name' not in employee) # 输出False

四、遍历字典

# 字典的遍历
employee = {
            'name':'王峰',
            'sex':'男',
            'hiredate':'1997-2-2',
            'salary':'2000',
            'job':'销售'
        }
  1. for key in 字典名
for key in employee:
    v = employee[key]
    print(v)
# 输出:
# 王峰
# 男
# 1997-2-2
# 2000
# 销售
  1. for key,value in 字典名.items()
for key,value in employee.items():
    print(key,value)
# 输出:
# name 王峰
# sex 男
# hiredate 1997-2-2
# salary 2000
# job 销售

五、方法

  1. (增改)删
# 字典的写操作
employee = {
            'name':'王峰',
            'sex':'男',
            'hiredate':'1997-2-2',
            'salary':'2000',
            'job':'销售',
            'welfare':100
        }

(1)增改
dic[指定key] = 指定值
dic.update(key1 = 指定值1 , key2 = 指定值2):有则改之,无则增之

# 字典的更新
employee['job'] = '运维'
print(employee)

# 对多个kv进行更新
employee.update(salary = 4000,welfare = 200)
print(employee)
# 输出:{'name': '王峰', 'sex': '男', 'hiredate': '1997-2-2', 'salary': 4000, 'job': '运维', 'welfare': 200}

# 注意:字典的新增同更新完全一样,秉承有则改之,无则增之
employee.update(dept = '市场部',weight = 70)
print(employee)
# 输出:{'name': '王峰', 'sex': '男', 'hiredate': '1997-2-2', 'salary': 4000, 'job': '运维', 'welfare': 200, 'dept': '市场部', 'weight': 70}

(2)删除
pop([指定key]):删除指定key对应的值
popitem():删除末尾的值
clear():将数据全部清除

# 字典的删除
# 1.pop删除指定的key
employee.pop('weight')
print(employee)
# 输出:{'name': '王峰', 'sex': '男', 'hiredate': '1997-2-2', 'salary': 4000, 'job': '运维', 'welfare': 200, 'dept': '市场部'}

# 2.popitem删除最后一个key
employee.popitem()
print(employee)
# 输出:{'name': '王峰', 'sex': '男', 'hiredate': '1997-2-2', 'salary': 4000, 'job': '运维', 'welfare': 200}

# 3.完全清除
employee.clear()
print(employee) # 输出:{}
  1. 常用
# 字典的常用操作
emp1 = {'name':'jack','grade':'B'}

(1)为字典设置默认值:
dic.setdefault([指定key] , [默认值})

# 1. 为字典设置默认值setdefault,如果某个key存在则忽略,反之则设置
emp2 = {'name':'lisa'}
emp2.setdefault('grade','C')

(2)字典的视图:
keys():获取所有的键值
values():获取所有的值
items():获取所有的键值对

# (1)keys代表所有的键
ks = emp1.keys()
print(ks) # 输出:dict_keys(['name', 'grade'])

# (2)values代表所有的值
vs = emp1.values()
print(vs) # 输出:dict_values(['jack', 'B'])

# (3)items代表所有的键值对,以元组的形式保存
its = emp1.items()
print(its) # 输出:dict_items([('name', 'jack'), ('grade', 'B')])

# 注意:视图中的数据随着字典中的内容的改变而改变
emp1['hiredate']  = '1997-2-2'
print(ks) # 输出:dict_keys(['name', 'grade', 'hireate'])
print(vs) # 输出:dict_values(['jack', 'B', '1997-2-2'])
print(its) # 输出:dict_items([('name', 'jack'), ('grade', 'B'), ('hireate', '1997-2-2')])

(3)字典的格式化输出:
format_map函数格式化

# (1)老版本的字符串格式化
emp_str = "姓名:%(name)s,评级:%(grade)s,入职时间:%(hiredate)s" %emp1
print(emp_str)
# 输出:姓名:jack,评级:B,入职时间:1997-2-2

# (2)新版本的字符串格式化
emp_str1 = "姓名:{name},评级:{grade},入职时间:{hiredate}".format_map(emp1)
print(emp_str1)
# 输出:姓名:jack,评级:B,入职时间:1997-2-2

六、 散列值(Hash)

  • 字典也成为“哈希”,对应散列值
  • 是某一个数据的唯一标识
  • Python提供hash()函数生成散列值
  • 对于数字来说,它的哈希值是它本身
  1. 将key值转换为hash值
  2. hash值根据换算后不连续的分配到内存中
  3. 内存中存上对应的value值
  4. 要注意的是,在内存中key的位置是无序的

七、Dictionary在项目中的应用(存放员工信息)

# 记录员工的信息:工号,姓名,职位,部门,薪水
source = "7782,CLARK,MANAGER,SALES,5000$" \
         "7934,MILLER,SALESMAN,SALES,3000$" \
         "7369,SMITH,ANALYST,RESEARCH,2000"


# 1. 根据$号将每条员工数据分割出来(分成了3组数据)(List类型)
emp_list = source.split("$")
print(emp_list)
# 输出:['7782,CLARK,MANAGER,SALES,5000', '7934,MILLER,SALESMAN,SALES,3000', '7369,SMITH,ANALYST,RESEARCH,2000']


# 声明all_emp用于存放所有员工信息,key:员工编号,value:员工信息
all_emp = {}

# 2. 员工信息存放在字典中
for i in range(0,len(emp_list)):

  # 2.1 根据,号分割每位员工的各项信息(List类型)
    employee = emp_list[i].split(",")

    # 2.2 将员工信息按键值对的方式存放(Dictionary类型)
    dic_emp = {'number':employee[0],'name':employee[1],'job':employee[2],'dept':employee[3],'salary':employee[4]}

    # 2.3 再次更改存放方式,key为员工编号,value则为对应员工的信息(Dictionary类型)
    all_emp[dic_emp['number']] = dic_emp


# 3. 根据员工编号查看员工信息
emp_no = input("请输入员工编号:")
if emp_no in all_emp:
    emp = all_emp.get(emp_no)
    print("员工编号:{number},姓名:{name},工作:{job},部门:{dept},薪水:{salary}".format_map(emp))
else:
    print("该员工编号不存在")