字典(dictionary)名称虽然奇怪,其实该种组合类型提供了一种通过名称(键)来访问元素(值)的方法。前面已经介绍过列表和元组,他们只能通过序号来访问每个元素。但是在一些应用场景下,序号方式并不方便。做个比喻,就像点名,可以使用一号二号来进行,但是有时更需要直接根据姓名点名,更有针对性,也易于记忆。因此,字典的应用很广,非常实用。
1)字典的创建
data = {'ID': '000001',
'name': '黎明',
'age': 16,
'height': 1.88
}
print(data)
输出为:
{'ID': '000001', 'name': '黎明', 'age': 16, 'height': 1.88}
这里的字典数据表达了一个学生的信息,数据包括学号(ID)、姓名(name)、年龄(age)和身高(height)。如果使用序号,虽然也能保存这些学号、姓名等信息,但是无法看出具体的语义区别,只能序号0代表学号,序号1代表姓名等等,非常难记。
我们来仔细看下字典的结构。它由一个花括号前后组成,里面都是一些通过逗号分隔的元素,这和列表通过逗号分隔不同元素是一样的。每个元素都是一个通过冒号连接的数值对,冒号前面的称之为“键(key)”,冒号后面的称之为“值(value)”。字典中,就是通过利用键来唯一的确定哪个元素,就像列表通过序号来访问每个元素一样。
因此,同一个字典中不同元素的键不能重复,否则无法定位到唯一的元素。事实上,如果有多个元素具有重复的键,只有最后一个元素才有意义。
元素的键和值的数据类型都是任意,只要键不一样即可,值可以重复,获取值只能根据所在的键。
来看一个复杂的结构:
data = {'ID': ['000001', '000002', '000003', '000004', '000005', '000006', '000007'],
'name': ['黎明', '赵怡春', '张富平', '白丽', '牛玉德', '姚华', '李南'],
'age': [16, 20, 18, 18, 17, 18, 16],
'height': [1.88, 1.78, 1.81, 1.86, 1.74, 1.75, 1.76]
}
它其实表示了类似于下面的一组数据,大家仔细体会:
ID | name | age | height |
000001 | 黎明 | 16 | 1.88 |
000002 | 赵怡春 | 20 | 1.78 |
000003 | 张富平 | 18 | 1.81 |
000004 | 白丽 | 18 | 1.86 |
000005 | 牛玉德 | 17 | 1.74 |
000006 | 姚华 | 18 | 1.75 |
000007 | 李南 | 16 | 1.76 |
2)字典的读取
字典的读取只能以键为依据。
data = {'ID': '000001',
'name': '黎明',
'age': 16,
'height': 1.88
}
print(data['name'])
print(data.get('name'))
两个输出功能一样 输出都为:黎明。其中,两种写法都使用键来获取指定的元素的值。第一种写法类似于列表,只是使用键替换了序号。
对于使用列表的字典数据,可以结合使用键访问字典的方法和使用序号访问列表的方法:
data = {'ID': ['000001', '000002', '000003', '000004', '000005', '000006', '000007'],
'name': ['黎明', '赵怡春', '张富平', '白丽', '牛玉德', '姚华', '李南'],
'age': [16, 20, 18, 18, 17, 18, 16],
'height': [1.88, 1.78, 1.81, 1.86, 1.74, 1.75, 1.76]
}
print(data['name'][1])
输出为:赵怡春
如果需要循环读取字典元素所有的值,遍历字典不能通过序号下标,而是通过键值对的信息来进行,下面介绍几种常见方法:
方法1(遍历键):
data = {'000001': '黎明',
'000002': '赵怡春',
'000003': '张富平',
'000004': '白丽',
'000005': '牛玉德',
'000006': '姚华',
'000007': '李南'}
for i in data:
print(i)
输出为:
000001
000002
000003
000004
000005
000006
000007
可以看出,默认遍历字典就是遍历键。
方法2(遍历键)
data = {'000001': '黎明',
'000002': '赵怡春',
'000003': '张富平',
'000004': '白丽',
'000005': '牛玉德',
'000006': '姚华',
'000007': '李南'}
for i in data.keys():
print(i)
输出为:
000001
000002
000003
000004
000005
000006
000007
方法3(遍历值):
data = {'000001': '黎明',
'000002': '赵怡春',
'000003': '张富平',
'000004': '白丽',
'000005': '牛玉德',
'000006': '姚华',
'000007': '李南'}
for i in data.values():
print(i)
输出为:
黎明
赵怡春
张富平
白丽
牛玉德
姚华
李南
方法4(遍历键值对):
data = {'000001': '黎明',
'000002': '赵怡春',
'000003': '张富平',
'000004': '白丽',
'000005': '牛玉德',
'000006': '姚华',
'000007': '李南'}
for i in data.items():
print(i)
输出为:
('000001', '黎明')
('000002', '赵怡春')
('000003', '张富平')
('000004', '白丽')
('000005', '牛玉德')
('000006', '姚华')
('000007', '李南')
此时的输出每个元素以元组的方式来呈现,因此具体获取其中的学号和姓名可以再次使用序号再获取。
3)字典的更新
data = {'ID': '000001',
'name': '黎明',
'age': 16,
'height': 1.88
}
data['age'] = 17 # 更新
data.pop('height') # 删除
print(data)
输出为:
{'ID': '000001', 'name': '黎明', 'age': 17}。如果多次对相同键进行更新,则以最后一次更新为准。
4)集合(set)
集合可以看成是只有键的字典,功能类似于列表,但是由于是键,因此不存在重复的元素值。
创建方法为:
data = set([8, 19, 27, 87, 8])
print(data)
输出为:{8, 27, 19, 87}
这里的花括号使之依然表现为字典的特征,创建方法也是利用列表来进行。由于只存储键,因此对相同元素,集合将自动去重。
更新方法为:
data = set([8, 19, 27, 87])
data.add(10) # 增加
data.remove(8) # 删除
print(data)
输出为:{10, 19, 87, 27}
集合还支持集合运算:
data1 = set([8, 19, 27, 87])
data2 = set([6, 10, 19, 76])
print(data1 & data2)
print(data1 | data2)
输出为:
{19}
{6, 8, 10, 76, 19, 87, 27}
配套学习资源、慕课视频: