一.字典的创建
1、key-value不同类型的创建
# value为list类型
d1 = {
'王超': [18, '男', '玩手机'],
'王凯': [18, '男', '修手机']
}
# value为数值类型
d2 = {
'a': 1,
'b': 2
}
# value为集合类型
d3 = {
'a': {1, 2, 3},
'b': {2, 3, 4}
}
print(d3)
print(d3['a'])
{'a': {1, 2, 3}, 'b': {2, 3, 4}}
{1, 2, 3}
2、字典的嵌套
students = {
'06163012': {
'name': '王凯',
'age': 18,
'score': 90
},
'03162003': {
'name': '管良虎',
'age': 19,
'score': 80
}
}
# 查看字典中key为'03162003'的字典中的key为'name'所对应的value
print(students['03162003']['name'])
3、工厂函数
d5 = dict(a=1, b=2)
print(d5)
{'a': 1, 'b': 2}
二.字典的特性
1、不支持索引、切片;并且字典的重复、连接是无意义的(因为key是唯一的)
d = {
'1':'a',
'8':'b',
'2':'a'
}
2、成员操作符:判断的是某个值是否为字典的key
print('1' in d)
print('1' not in d)
True
False
3、for循环: 默认遍历字典的key值
# 遍历字典
for key in d:
print(key, d[key])
1 a
8 b
2 a
三.字典的增加
services = {
'http': 80,
'ftp': 21,
'ssh': 22
}
1、增加一个元素
- 如果key值存在,则更新对应的value值
services['http'] = 443 #'http'存在所以更新value值
print(services)
{'http': 443, 'ftp': 21, 'ssh': 22}
- 如果key值不存在,则添加对应的key-value值
services['mysql'] = 3306 # 'mysql'不存在,所以添加新的key-value
print(services)
{'http': 80, 'ftp': 21, 'ssh': 22, 'mysql': 3306}
2、增加多个元素(key存在则更新,不存在则添加)
service_backup = {
'tomcat': 8080,
'https': 443,
'http': 8888
}
- 方法一:更新由多个元素组成的字典
services.update(service_backup)
print(services)
{'http': 8888, 'ftp': 21, 'ssh': 22, 'tomcat': 8080, 'https': 443}
- 方法二:使用工厂函数
services.update(flask=9000, http=999)
print(services)
{'http': 999, 'ftp': 21, 'ssh': 22, 'flask': 9000}
3、setdefault添加key值
services = {
'http': 80,
'ftp': 21,
'ssh': 22
}
- 如果key值存在,则不做修改
services.setdefault('http', 9000) # 注意这里'http'存在,但是不更新value
print(services)
{'http': 80, 'ftp': 21, 'ssh': 22}
- 如果key值不存在,则添加对应的key-value值
services.setdefault('oracle', 44575)
print(services)
{'http': 80, 'ftp': 21, 'ssh': 22, 'oracle': 44575}
四.字典的删除
services = {
'http': 80,
'ftp': 21,
'ssh': 22,
'mysql': 3306
}
1、del 关键字
del services['http']
print(services)
{'ftp': 21, 'ssh': 22, 'mysql': 3306}
2、pop删除指定的key的key-value值
- 如果key存在,删除,并且返回删除key对应的value值
item = services.pop('http')
print(item) # 删除'http' 键值对,并返回value:80
print(services)
80
{'ftp': 21, 'ssh': 22, 'mysql': 3306}
- 如果key不存在,直接报错
3、popitem删除最后一个key-value
item = services.popitem() # 删除最后一个键值对,并返回键值对
print('删除的key-value对应的是:', item)
print(services)
删除的key-value对应的是: ('mysql', 3306)
{'http': 80, 'ftp': 21, 'ssh': 22}
4、清空字典内容
services.clear()
print(services)
{}
五.字典的查看
service = {
'http': 80,
'mysql': 3306
}
1、查看key值、查看value值
print(service.keys())
print(service.values())
dict_keys(['http', 'mysql'])
dict_values([80, 3306])
2、遍历字典
- for循环
for k,v in service.items(): #for循环中两种方法遍历
print(k,'---->',v)
for k in service:
print(k,'---->',service[k])
http ----> 80
mysql ----> 3306
3、查看指定key对应的value值(两种方法)
1、第一种
print(service['https']) #'https'不存在,所以报错
2、第二种,get方法
- 如果key值存在,返回对应的value值
print(service.get('https'))
输出:None
- 如果key值不存在,默认返回None,如果需要指定返回的值,传值即可
print(service.get('https', 'key not exit')) # 指定返回key not exit
输出:key not exit
3、一个应用
通过字典的方法计算出bag列表中某种元素出现的次数。
counter = {}
bag = [1, 2, 5, 2, 4, 1]
for i in bag:
counter[i] = counter.get(i, 0) + 1
for i in set(bag):
print("Counter of {}:{}".formate(i, counter.get(i, "none")))
Counter of 1:2
Counter of 2:2
Counter of 4:1
Counter of 5:1
六、字典序列
1、字典排序
adict = {
'1': 1,
'3': 3,
'5': 5,
'4': 4,
'2': 2
}
alist = sorted(adict.items(), key=lambda e: e[1], reverse=False)
print(alist)
[('1', 1), ('2', 2), ('3', 3), ('4', 4), ('5', 5)]
其中,e表示dict.items()中的一个元素,e[0]表示按键排序,e[1]则表示按值排序。reverse=False可以省略,默认为升序排列。
说明:字典的items()函数返回的是一个列表,列表的每个元素是一个键和值组成的元组。因此,sorted(dict.items(), key=lambda e:e[1], reverse=True)返回的值同样是由元组组成的列表。
2、字典保持有序
from collections import OrderedDict
dict = OrderedDict()
说明:
1、OrderedDict 的内容维护是一个双向链表,会根据添加元素的顺序来排列键的位置,第一个添加的元素放置在链表的末尾,所以对已经存在的键做重新赋值也不会改变键的顺序
2、ORderedDict的大小是普通字典的两倍多,是因为它额外创建的链表所导致的。因此,构建大量的OrderedDict的数据结构,要具体的做对应的需求分析,
七、字典合并
dic1 = {'1':1,'2':2}
dic2 = {'3':3,'4':4}
dic = {**dic1,**dic2}
dic = dic1|dic2 # python3.9 dic1 |= dic2