Python字典


1. 简介

  • \color{grey}{列表存储数据的问题:}

结构化数据是指有明确属性,明确表示规则的数据
列表在表达结构化数据时语义不明确

  • \color{red}{字典与列表的区别:}

列表有序存储数据,按索引值进行提取
字典采用键值方式存储数据,数据无序存储

  • \color{green}{字典的特点:}
  • 字典采用键(key):值(value)形式表达数据
  • 字典中key不允许重复value允许重复
  • 字典是可修改的,运行时动态调整存储空间
  • \color{yellow}{散列值与字典的存储原理:}

字典也被称为哈希(hash),对应散列值
散列值是从任何一种数据中创建数字指纹
Python中提供了hash()函数生成散列值


2. 创建字典

  • \color{green}{直接创建:}

使用{}
用法:字典名 = {'key': value, 'key': value...}

字典的key与value之间用冒号: 分隔,键值对之间用逗号,分隔,key 约定俗成建议最好使用英文

  • \color{blue}{示例:}
# 创建空字典
>>> dict1 = {}
>>> print(dict1)
{}

# 创建一个个人信息字典
>>> dict2 = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
>>> print(dict2)
{'name': '张三', 'sex': '男', 'hiredate': '1994-10-14', 'grade': 'A', 'job': '销售', 'salary': 1000, 'welfare': 100}
  • \color{green}{使用函数创建:}

函数:dict()
用法:dict(key=value, key=value...)

使用函数 dict() 创建字典时,key不能使用引号引起来,否则会报错

  • \color{green}{给键设置默认值:}

函数:dict.fromkeys()
用法:dict.fromkeys([key列表], '默认值')

fromkeys 必须配合 dict函数 使用,将给定列表中的每个元素作为 key,默认值为 value ,默认值不设置则为 None

  • \color{blue}{dict()创建字典示例:}
# 利用函数dict()创建字典
>>> dict3 = dict(name='张三',sex='男',hiredate='1994-10-14',grade='A',job='销售',salary=1000,welfare=100)
>>> print(dict3)
{'name': '张三', 'sex': '男', 'hiredate': '1994-10-14', 'grade': 'A', 'job': '销售', 'salary': 1000, 'welfare': 100}
  • \color{blue}{设置默认值示例:}
# 不设置默认值则所有键的值为None
>>> dict4 = dict.fromkeys(['name', 'sex', 'hiredate', 'grade', 'job', 'salary', 'welfare'])
>>> print(dict4)
{'name': None, 'sex': None, 'hiredate': None, 'grade': None, 'job': None, 'salary': None, 'welfare': None}

# 给键设置了默认值N/A
>>> dict4 = dict.fromkeys(['name', 'sex', 'hiredate', 'grade', 'job', 'salary', 'welfare'], 'N/A')
>>> print(dict4)
{'name': 'N/A', 'sex': 'N/A', 'hiredate': 'N/A', 'grade': 'N/A', 'job': 'N/A', 'salary': 'N/A', 'welfare': 'N/A'}

3. 字典的访问


3.1 字典的取值操作

  • \color{green}{方法1:}

字典名['key']

跟列表取单值方法类似,当获取的key不存在时会报错

  • \color{green}{方法2:}

函数:get()
用法:字典名.get('key')

当获取的 key 不存在时,不报错,返回 None
可以用 get('key', '值') 给键设置默认值,当键存在时返回其值,不存在时返回设置的默认值

  • \color{blue}{示例:}
# 定义一个字典
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
# 取值
>>> print(employee['name'])
张三
# 函数get()取值
>>> print(employee.get('name'))
张三

# 取不存在key值(报错)
>>> print(employee['age'])
Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    print(employee['age'])
KeyError: 'age'
# get()取不存在的key值
>>> print(employee.get('age'))
None

# 用get设置不存在键的默认值
print(employee.get('age', 26))
26

3.2 给字典设置默认值

  • \color{green}{方法:}

函数:setdefault()
用法:字典名.setdefault('key', 默认值)

为指定key设置默认值,如果key已存在则忽略,不存在则设置,默认值不设置则为 None

  • \color{blue}{示例:}
>>> emp1 = {'name': 'jacky', 'grade': 'B'}
>>> emp2 = {'name': 'lily', 'grade': 'A'}

#当key存在时
>>> emp1.setdefault('grade', 'C')
'B'
>>> print(emp1)
{'name': 'jacky', 'grade': 'B'}

#当key不存在时
>>> emp2.setdefault('sex', '男')
'男'
>>> print(emp2)
{'name': 'lily', 'grade': 'A', 'sex': '男'}
  • \color{red}{get与setdefault区别:}
  • get() 是获取字典 key的值 ,key存在时返回其值,不存在则返回设置的 默认值不会改变字典原有数据
  • setdefault() 是设置字典 key的值 ,key存在忽略,不存在则新增并设置 默认值当key不存在时会改变字典数据

3.3 格式化输出字典

  • \color{green}{方法:}

函数:format_map()
用法:"{key}, {key}".format_map(字典名)

老版本的字符串格式化:%(key)s, %(key)s" %字典名

  • \color{blue}{示例:}
>>> emp = {'name': 'jacky', 'grade': 'B', 'hiredate': '2020-05-30'}

# 老版本格式化字符串
>>> emp_old_str = "姓名:%(name)s, 评级:%(grade)s, 入职时间:%(hiredate)s" %emp
>>> print(emp_old_str)
姓名:jacky, 评级:B, 入职时间:2020-05-30

# 新版本格式化字符串
>>> emp_new_str = "姓名:{name}, 评级:{grade}, 入职时间:{hiredate}".format_map(emp)
>>> print(emp_new_str)
姓名:jacky, 评级:B, 入职时间:2020-05-30

3.4 判断key存在与否

  • \color{green}{成员运算符:}

'key' in 字典名
'key' not in 字典名

in 存在返回 True,不存在返回 False
not in 则相反


3.5 遍历字典


3.5.1 遍历key

  • \color{green}{方法1:}

for k in 字典名:
键:k
值:字典名[k]

  • \color{blue}{示例:}
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
>>> for k in employee:
    print("键: {}".format(k))      #取键
    print("值: {}".format(employee[k]))      #取值

键: name
值: 张三
  -- snip --
  • \color{green}{方法2(函数):}

for k in 字典名.keys():
键:k
值:字典名[k]

函数 keys() 用于获取字典的所有键
用法:字典名.keys()
使用 type() 打印类型会发现是一个特殊的 dict_keys 类型

  • \color{blue}{示例:}
# 效果与示例1相同
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
>>> for k in employee.keys():
    print("键: {}".format(k))
    print("值: {}".format(employee[k]))

键: name
值: 张三
  -- snip --
# 一个特殊的dict_keys类型
>>> employee.keys()
dict_keys(['name', 'sex', 'hiredate', 'grade', 'job', 'salary', 'welfare'])
>>> type(employee.keys())
<class 'dict_keys'>

3.5.2 遍历value

  • \color{green}{方法:}

for v in 字典名.value():
值:v

函数 values() 用于获取字典的所有值
用法:字典名.values()
使用 type() 打印类型会发现是一个特殊的 dict_values 类型

  • \color{blue}{示例:}
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
>>> for v in employee.values():
    print(v)
    
张三
男
  -- snip --
# 一个特殊的dict_values类型
>>> employee.values()
dict_values(['张三', '男', '1994-10-14', 'A', '销售', 1000, 100])
>>> type(employee.values())
<class 'dict_values'>

3.5.3 遍历键值对

  • \color{green}{方法:}

for k,v in 字典名.items():
键:k
值:v

函数 items() 用于获取字典的所有键值对
用法:字典名.items()
使用 type() 打印类型会发现是一个特殊的 dict_items 类型

  • \color{blue}{示例:}
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
>>> for k,v in employee.items():
    print("键: {}".format(k))
    print("值: {}".format(v))

键: name
值: 张三
  -- snip --
# 一个特殊的dict_items类型
>>> employee.items()
dict_items([('name', '张三'), ('sex', '男'), ('hiredate', '1994-10-14'), ('grade', 'A'), ('job', '销售'), ('salary', 1000), ('welfare', 100)])
>>> type(employee.items())
<class 'dict_items'>
  • \color{red}{总结:}

dict_ 开头的类型,被称为字典的 视图对象,视图对象会随着字典的内容随时发生变化



4. 字典的更新、增加与删除


4.1 更新

  • \color{green}{更新单个值:}

字典名['key'] = 新值

字典单个值更新的方法与列表相同

  • \color{green}{更新多个值:}

函数:update()
用法:字典名.update(键=值, 键=值...)

使用 update() 更新字典值时,() 内的 不要加引号,否则会报错

  • \color{blue}{示例:}
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }

#更新单值
>>> employee['grade'] = 'B'
>>> print(employee)
{'name': '张三', 'sex': '男', 'hiredate': '1994-10-14', 'grade': 'B', 'job': '销售', 'salary': 1000, 'welfare': 100}

# 更新多值
>>> employee.update(salary=1200, welfare=150)
>>> print(employee)
{'name': '张三', 'sex': '男', 'hiredate': '1994-10-14', 'grade': 'B', 'job': '销售', 'salary': 1200, 'welfare': 150}

4.2 增加

字典的新增与更新操作完全相同,秉承有则更新,无则新增的原则(更新的值不存在就增加)

  • \color{blue}{示例:}
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }

#无则新增
>>> employee['dept'] = '研发部'
>>> print(employee)
{'name': '张三', 'sex': '男', 'hiredate': '1994-10-14', 'grade': 'A', 'job': '销售', 'salary': 1000, 'welfare': 100, 'dept': '研发部'}

#有则更新
>>> employee['dept'] = '市场部'
>>> print(employee)
{'name': '张三', 'sex': '男', 'hiredate': '1994-10-14', 'grade': 'A', 'job': '销售', 'salary': 1000, 'welfare': 100, 'dept': '市场部'}

#新增多值时同理
>>> employee.update(weight=80, dept='财务部')
>>> print(employee)
{'name': '张三', 'sex': '男', 'hiredate': '1994-10-14', 'grade': 'A', 'job': '销售', 'salary': 1000, 'welfare': 100, 'dept': '财务部', 'weight': 80}

4.3 删除

  • \color{green}{删除指定key:}

del语句
用法:del 字典名['key']

  • \color{blue}{del语句示例:}
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
>>> del employee['salary']
>>> print(employee)
{'name': '张三', 'sex': '男', 'hiredate': '1994-10-14', 'grade': 'A', 'job': '销售', 'welfare': 100}

函数:pop()
用法:字典名.pop('key')

  • \color{blue}{pop函数示例:}
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
>>> employee.pop('hiredate')
'1994-10-14'
>>> print(employee)
{'name': '张三', 'sex': '男', 'grade': 'A', 'job': '销售', 'salary': 1000, 'welfare': 100}
  • \color{green}{删除最后一个key:}

函数:popitem()
用法:字典名.popitem()

  • \color{blue}{示例:}
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
>>> employee.popitem()
('welfare', 100)
>>> print(employee)
{'name': '张三', 'sex': '男', 'hiredate': '1994-10-14', 'grade': 'A', 'job': '销售', 'salary': 1000}
  • \color{green}{清空字典:}

函数:clear()
用法:字典名.clear()

字典名 = {} 也可以清空字典,清空后返回一个空字典

  • \color{blue}{示例:}
# clear()函数
>>> employee = {'name': '张三', 'sex': '男',
     'hiredate': '1994-10-14', 'grade': 'A',
     'job': '销售', 'salary': 1000,
     'welfare': 100
     }
>>> 
>>> employee.clear()
>>> print(employee)
{}

#效果相同
>>> employee = {}
>>> print(employee)
{}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355