python之字典(dict)详细介绍

1. 基本介绍

1.1 定义

字典是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据
举例:有份成绩表数据,语文:79,数学:80,英语:92。这组数据看上去像两个列表(语文、数学、英语)、(79、80、92),但这两个列表的元素之间有一定的关联关系。
如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。
为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中 key 和 value 的关联关系如图 1 所示:
在这里插入图片描述
参考文章:Python字典及基本操作(超级详细)

1.2 特征

  • 字典作⽤:和列表类似,都是⽤来存储对象的容器。然而列表存储数据的性能好,但是查询数据的性能差,字典正好与之相反
  • 字典索引:字典与列表相似,但是又不同。列表、元组是用位置索引取值,但字典是通过key寻找,即在字典中每⼀个元素都有唯⼀的名字(key),通过这个唯⼀的名字可以找到指定的元素。可以理解为,key就是字典的索引。
  • 字典结构:字典我们也称之为键值对(key-value)结构,每个字典中都可以有多个键值对,⽽每⼀个键值对我们称其为⼀项(item)

2. 字典用法

2.1 字典创建8种方法

  • 字典的值(value)可以是任意对象
  • 字典的key可以是任意不可变对象(int str tuple bool…)
  • 字典键(key)是不能重复的,如果出现重复后面的会替换前面的值
  1. 创建空字典
dict = {}  # 创建空字典
type(dict)  # 结果为 dict
  1. 直接赋值创建
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}  # 直接赋值创建
type(dict1)  # 结果为 {'name': '葫芦娃','age':'17','gender':'男'}
  1. 通过dict函数和关键字参数创建
    注意key不用加引号
dict2 = dict(name='葫芦娃',age='17',gender='男')  #通过dict函数和关键字参数创建 # 注意key不用加引号
print(dict2)  # 结果为 {'name': '葫芦娃','age':'17','gender':'男'}
  1. 通过二元组列表创建
# 双值子序列
# 双值序列 序列中只有两个值,('x',1),'ab',[5,6]
# 子序列 如果序列中元素也是序列 那么我们就称这个元素为子序列 [(4,5),(6,7)]
list1 = [('name','葫芦娃'),('age','17'),('gender','男')]
dict3 = dict(list1)
print(dict3)  # 结果为 {'name': '葫芦娃','age':'17','gender':'男'}
  1. dict和zip结合创建
dict4 = dict(zip('abc', [1, 2, 3]))  # dict和zip结合创建
print(dict4)  # 结果为 {'a': 1, 'b': 2, 'c': 3}
  1. 通过字典推导式创建
dict5 = {i:2*i for i in range(3)} # 通过字典推导式创建
print(dict5)  # 结果为{0: 0, 1: 2, 2: 4}
  1. 通过dict.fromkeys()创建
dict6 = dict.fromkeys(range(3), 'x')  # 通过dict.fromkeys()创建 通常用来初始化字典, 设置value的默认值
print(dict6)  # 结果为{0: 'x', 1: 'x', 2: 'x'}
  1. 通过列表切片,dict和zip结合创建
list2 = ['x', 1, 'y', 2, 'z', 3]
dict7 = dict(zip(list2[::2], list2[1::2]))  # 其他,通过列表切片,dict和zip结合创建
print(dict7)  # 结果为{'x': 1, 'y': 2, 'z': 3}

参考文章:Python创建字典的八种方式

2.2 字典基本方法

  • 通过 key 访问 value
    通过 key 访问 value 使用的也是方括号语法,就像前面介绍的列表和元组一样,只是此时在方括号中放的是 key,而不是列表或元组中的索引
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
print(dict1['name'])  # 结果为:葫芦娃
  • 通过 key 添加 key-value 对
    如果要为 dict 添加 key-value 对,只需为不存在的 key 赋值即可。
    如果为dict添加已存在的key-value 对,则会覆盖原有的key对应的value
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
dict1['edu'] = '本科毕业'
print(dict1)  # 结果为:print(dict1)  # 结果为: {'name': '葫芦娃', 'age': '17', 'gender': '男', 'edu': '本科毕业'}

dict1['age'] = '18'
print(dict1)  # 结果为:print(dict1)  # 结果为: {'name': '葫芦娃', 'age': '18', 'gender': '男', 'edu': '本科毕业'}

  • 通过 key 删除 key-value 对
    同元素和列表一样,要删除宇典中的 key-value 对,则可使用 del 语句
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
del dict1['age']
print(dict1)  #结果为 {'name': '葫芦娃','gender':'男'}
  • 通过 key 修改 key-value 对
    如果为dict修改已存在的key-value 对,则直接重新添加会覆盖原有的key对应的value
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
dict1['age'] = '18'
print(dict1)  # 结果为:print(dict1)  # 结果为: {'name': '葫芦娃', 'age': '18', 'gender': '男'}
  • 通过 key 判断指定 key-value 对是否存在
    要判断字典是否包含指定的 key,则可以使用 in 或 not in 运算符。需要指出的是,对于 dict 而言,in 或 not in 运算符都是基于 key 来判断的
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
print(name in dict1) # 结果为True
  • 总结key的重要性
    字典的 key 是关键。如上所言,字典 key 是它的索引,并且 key 可以是任意不可变类型。
    可以这样说,字典相当于索引是任意不可变类型的列表:而列表则相当于 key 只能是整数的字典。因此,如果程序中要使用的字典的 key 都是整数类型,则可考虑能否换成列表。

此外,还有一点需要指出,列表的索引总是从 0 开始、连续增大的;但字典的索引即使是整数类型,也不需要从 0 开始,而且不需要连续。因此,列表不允许对不存在的索引赋值:但字典则允许直接对不存在的 key 赋值,这样就会为字典增加一个 key-value 对。

列表不允许对不存在的索引赋值,但字典则允许直接对不存在的 key 赋值。

2.3 字典常用方法

字典由 dict 类代表,在交互式解释器中输入 dir(dict) 命令,得到字典类包含的方法:[‘clear’, ‘copy’, ‘fromkeys’, ‘get’, ‘items’, ‘keys’, ‘pop’, ‘popitem’, ‘setdefault’, ‘update’, ‘values’]

 dir(dict)
# 结果为 ['clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

2.3.1 清空key-value方法.clear()

'''
清空字典中的key-value
'''
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
dict1.clear()
print(dict1)  # 结果为 {}

2.3.2 获取字典中值的方法.get()

get() 方法其实就是根据 key 来获取 value,它相当于方括号语法的增强版,当使用方括号语法访问并不存在的 key 时,字典会引发 KeyError 错误;但如果使用 get() 方法访问不存在的 key,该方法会简单地返回 None,并且可以自定义输出的值

'''
获取字典中的value
前面我们讲过用dict1[key] 获得
现在用dict1.get(key) 方法获得
'''
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
print(dict1.get('name')) # 结果为 葫芦娃
print(dict1.get('edu')) # 结果为 none
print(dict1.get('edu','没有这个key')) # 结果为 没有这个key

2.3.3 更新字典中key-value的方法.update()

'''
更新字典中的key-value
这里的更新是一起更新key-value
也可以理解为两个字典合并
'''
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
dict2 = {'edu': '本科毕业','hometown':'广东'}
dict1.update(dict2)
print(dict1) # 结果为 {'name': '葫芦娃', 'age': '17', 'gender': '男', 'edu': '本科毕业', 'hometown': '广东'}

2.3.4 分别获取字典中的item、key、value的方法.items()、.keys()、.values()

'''
获取字典中的item、key、value
通过赋值给变量,然后转为列表,最后方括号取值
'''
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
dict1_item = dict1.items()
print(dict1_item)  # 结果为dict_items([('name', '葫芦娃'), ('age', '17'), ('gender', '男')])
print(list(dict1_item)[0])  # 结果为

dict1_key = dict1.keys()
print(dict1_key)  # 结果为 dict_keys(['name', 'age', 'gender'])
print(list(dict1_key)[0])  # 结果为 name

dict1_value = dict1.values()
print(dict1_value,)  # 结果为 dict_values(['葫芦娃', '17', '男'])
print(list(dict1_value)[0])  # 结果为 葫芦娃

2.3.4 分别返回字典中丢弃的item的item和value的方法.popitems()、.pop()

pop() 方法用于获取指定 key 对应的 value,并删除这个 key-value 对。
popitem() 方法用于随机弹出字典中的一个 key-value 对,一般弹出为最后一个。

'''
通过pop、popitem丢弃字典中的key-value
会返回得到value和items
'''
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
a = dict1.pop('name')
print(a,dict1) # 结果为: 葫芦娃 {'age': '17', 'gender': '男'}
b = dict1.popitem()
print(b,dict1)  # 结果为:('gender', '男') {'age': '17'}

2.3.5 获取字典中的value方法.setdefalut()

setdefault() 方法用于根据 key 来获取对应 value 的值。
该方法有一个额外的功能,即当程序要获取的 key 在字典中不存在时,该方法会先为这个不存在的 key 设置一个默认的 value,然后再返回该 key 对应的 value
总结:setdefault() 方法总能返回指定 key 对应的 value
如果该 key-value 对存在,则直接返回该 key 对应的 value;
如果该 key-value 对不存在,则先为该 key 设置默认的 value,然后再返回该 key 对应的 value

'''
dict.setdefault(key[,default]) 字典中添加key-value
如果key已经存在到字典当中,则返回key的值 不会对字典做任何操作
如果key不存在,则像字典中添加这个Key 并设置value
'''
dict1 = {'name': '葫芦娃','age':'17','gender':'男'}
dict1.setdefault('edu','本科')
r = dict1.setdefault('hometown','广东')
print(r)  # 广东
print(dict1)  # {'name': '葫芦娃', 'age': '17', 'gender': '男', 'edu': '本科', 'hometown': '广东'}

2.3.6 创建字典的方法.fromkeys()

fromkeys() 方法使用给定的多个 key 创建字典,这些 key 对应的 value 默认都是 None;也可以额外传入一个参数作为默认的 value。该方法一般不会使用字典对象调用(没什么意义),通常会使用 dict 类直接调用

'''
创建字典,无传入value,则key默认为None
'''
# 使用列表创建包含2个key的字典
a_dict1 = dict.fromkeys(['a', 'b'])
print(a_dict1) # {'a': None, 'b': None}
a_dict2 = dict.fromkeys(['a', 'b'],[1,2])
print(a_dict2) # {'a': [1,2], 'b':[1,2]}

# 使用元组创建包含2个key的字典
b_dict1 = dict.fromkeys((13, 17))
print(b_dict1) # {13: None, 17: None}
b_dict2 = dict.fromkeys((13, 17),['a','b'])
print(b_dict2) # {13: ['a','b'], 17: ['a','b']}

# 使用元组创建包含2个key的字典,指定默认的value
c_dict = dict.fromkeys((13, 17), 'good')
print(c_dict) # {13: 'good', 17: 'good'}

2.4 遍历字典

'''
遍历字典
keys() 该方法返回的是字典所有的Key
values() 返回一个序列,该序列中保存有字典的值
items() 返回字典所有的项 它返回的是一个序列 序列包含的是双值子序列
双值分别是 字典中的Key和value
'''

d = {'name':'葫芦娃','age':7,'gender':'男'}
print(d.items())  # dict_keys(['name', 'age', 'gender'])
print(d.keys())  # dict_keys(['name', 'age', 'gender'])
print(d.values())  # dict_values(['葫芦娃', 7, '男'])

# 第一种  遍历key
for k in d.keys():
    print(d[k])
# 结果:
# name 
# age
# gender

# 第二种  遍历value
for v in d.values():
    print(v)
# 结果:
# 葫芦娃
# 7
# 男

# 第三种  遍历item
for k,v in d.items():
    print(k,v)
# 结果:
# name 葫芦娃
# age 7
# gender 男

3. 练习

'''
a = {"name":"123","data":{"result":[{"src":"python1"},
{"src":"python2"},{"src":"python3"}]}} 
找到 python1/python2/python3
'''
a = {"name":"123","data":{"result":[{"src":"python1"},
{"src":"python2"},{"src":"python3"}]}}
a_value = a.values()
b = list(a_value)[1]  # b = {'result': [{'src': 'python1'}, {'src': 'python2'}, {'src': 'python3'}]}
for v1 in b.values():
# v1 为 [{'src': 'python1'}, {'src': 'python2'}, {'src': 'python3'}]
    for v2 in v1:
# v2 为 :{'src': 'python1'} 、{'src': 'python2'} 、{'src': 'python3'}
        for v3 in v2.values():
            print(v3)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值