python字典(dict)详解

1. 字典的定义

python的字典(dict)属于映射类型,是数据的无序集合,字典内的元素都是key:value形式的键值对,所有键值对存储在一对大花括号{}中,每一个键值对之间使用逗号分隔。

{'name': '小明', 'age': 14}

字典的key不允许重复,如果向字典中插入重复的key,新的value会替换旧的value。

当数值类型做为字典的key时遵循数字比较的一般规则,如果数值相等则视为同一个key,例如1 和 1.0 ,他们使用比较运算符 == 进行比较时是相等的,但考虑到计算机对浮点型数据存储的是近似值,因此用float类型数据做字典的key是不明智的。

此外,尽量避免使用bool类型对象做字典的key,bool类型是int类型的子类,True与1在python中是相等的,因此下面的字典看似定义了两个key:value对,实际只有一个

int_dict = {
    1: '1做key',
    True: 'True做key'
}

print(int_dict)         # {1: 'True做key'}

后定义的True: 'True做key' 覆盖了之前定义的1: '1做key'。

任意类型的对象都可以做python字典的value,但只有可hash的对象才能做字典的key,像列表,字典,集合都不是可hash的对象,因此他们不能做字典的key。判断是一个对象是否可hash,可以使用内置函数hash,如果对象是可hash的,hash函数就能够返回对象的hash值,若不可hash则会抛出TypeError异常。

2. 创建python字典

2.1 使用{}创建字典

使用一对大括号{} ,可以创建一个空字典,字典里没有任何元素。

empty_dict = {}

在{}里添加key:value对,可以创建非空的字典

contacts_dict = {
    "小王": '13892339876',
    "小张": '13898320987',
    "小李": '13890348745'
}

字典中元素的个数是3,一个key:value对算是一项元素,这个字典里的key和value都是字符串类型,想要获得字典里元素的个数,需要使用内置函数len

print(len(contacts_dict))   # 3

2.2 使用内置函数dict创建字典

dict函数的语法如下

class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)

参数说明:

  • kwarg 关键字参数
  • mapping 关联式的容器类型
  • iterable 可迭代对象

dict函数返回一个新的字典,下面是使用示例

传入一个字典

>>> new_dict = dict({'name': '小明', 'age': 14})
>>> new_dict
{'name': '小明', 'age': 14}

传入关键字参数

>>> new_dict = dict(name='小明', age=14)
>>> new_dict
{'name': '小明', 'age': 14}

传入可迭代对象

>>> new_dict = dict([('name', '小明'), ('age', 14)])
>>> new_dict
{'name': '小明', 'age': 14}

3. 字典新增键值对

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

score_dict['小丽'] = 100

通过对字典的一个key进行赋值可以向字典中插入新的key:value对,字典在使用key时,必须要用中括号[]紧跟在字典后面,在中括号里填写key的值,这种方式被称为索引方式。

4. 修改字典

修改字典里某个key所对应的value值,写法与向字典里新增key:value对是相同的,都需要通过使用[]的索引方式进行。

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}
score_dict['小明'] = 100
print(score_dict)

在定义字典score_dict时,已经有一个key的值是'小明', score_dict['小明'] = 100 会修改'小明' 所对应的value,print语句最终输出的结果

{
    '小明': 100,
    '小刚': 98,
    '小红': 94
}

稍作总结,当使用如下的语法时

dict[key] = value

如果key已经存在,那么这行代码的作用就是在修改key所对应的value,如果key不存在,这行代码的作用就是向字典里插入一个新的key:value对。

5. 删除字典里的元素

删除字典里的某个key:value,可以使用del关键字。

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

del score_dict['小明']
print(score_dict)           # {'小刚': 98, '小红': 94}

此外,也可以使用字典的pop方法

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

score_dict.pop('小明')
print(score_dict)           # {'小刚': 98, '小红': 94}

不论是del还是pop方法,都需要指明要删除哪个key,如果想要删除全部的元素,则可以使用clear方法,clear会清空字典里所有的元素。

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

score_dict.clear()
print(score_dict)           # {}

执行clear方法后,score_dict变为一个空字典。

6. 获取字典里的值

python 字典

上小学时我们都有过查字典的经历,我们想要知道一个汉字在字典里的哪一页,可以通过拼音音节索引来查找,拼音音节就相当于python字典里的key,音节所对应的页数就相当于python字典里的value。

任何时候,我们对字典里的元素的访问,修改,删除,都必须通过key来进行。

想要获取某个特定的key所对应的value值,可以通过dict[key] 这种语法来实现

score_dict = {
    '小明': 99,
    '小刚': 98,
    '小红': 94
}

print(score_dict['小红'])       # 94

需要特别指出的是,通过key获取value时,如果key不存在,会引发KeyError异常

print(score_dict['小丽'])

字典中并没有'小丽'这个key,因此这样代码会引发异常

Traceback (most recent call last):
  File "/Users/kwsy/PycharmProjects/pythonclass/mytest/demo.py", line 7, in <module>
    print(score_dict['小丽'])
KeyError: '小丽'

KeyError表示不存在'小丽'这个key

7 遍历字典

遍历字典的key与value是常见的操作,写法很多,下面两种写法都能够实现对字典的遍历。

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

for key in score_dict:
    print(key, score_dict[key])

这种for循环写法会遍历字典的key,通过key获得所对应的value,另外一种写法是通过字典的items方法来同时遍历字典的key与value

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

for key, value in score_dict.items():
    print(key, value)

两种写法最终输出的结果一致

小明 96
小刚 98
小红 94

8. 字典常用方法

方法 功能作用
clear() 删除字典内所有的元素
copy() 返回字典的浅复制
fromkeys() 以指定key创建一个新的字典
get() 返回指定key的值
items() 成对返回所有key和value
keys() 返回字典所有的key
values 返回字典所有value
setdefault() 为key设置对应的默认值
update() 更新字典
pop() 删除键值对

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案