Dictionary(字典)
一种通过名字引用值的数据结构,这种结构类型称为映射(mapping)。字典是Python中唯一内建的映射类型,字典指定值并没有特殊顺序,都存储在一个特殊的键(Key)里,键可以是数字、字符串或元组。字典是另一种可变容器模型,可存储任意类型的对象。
1.1 认识字典的作用
students = ['小明','小红','小张','王军']
numbers = ['1001','1002','1003','1004']
# 假设需要查找小张的学号则需:
print('小张的学号:',numbers[students.index('小张')])
小张的学号: 1003
students = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004'
}
print('小张的学号:',students['小张']) # 通过键访问字典对应的值
小张的学号: 1003
1.2 创建和使用字典
字典的创建格式如下:
dict_one = {
key1: value1,
key2: value2
}
1.2.1 dict()函数
student = [('name','小明'),('number','1001')]
detail = dict(student)
print('学生详细信息:', detail)
学生详细信息: {'name': '小明', 'number': '1001'}
1.2.2 修改字典
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004'
}
stu['王军']
'1004'
stu['王军'] = '1005'
stu['王军']
'1005'
1.2.3 删除字典
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004'
}
print(stu)
{'小明': '1001', '小红': '1002', '小张': '1003', '王军': '1004'}
del stu['王军']
print(stu)
{'小明': '1001', '小红': '1002', '小张': '1003'}
# 删除字典 del stu
1.2.4 字典的特性
字典值可以没有限制地取任何Python对象,既可以是标准对象,也可以是用户定义的对象,但键不行。需要记住以下两点:
(1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后面的值会被记住;
(2)键必须不可变,可以用数字、字符串或元组充当,不能用列表。
1.2.5 len()函数
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004'
}
len(stu) # 统计字典中键的总数
4
type(stu)
dict
1.2.6 字典的格式化字符串
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004'
}
print('小明的学号是:%(小明)s' %stu)
小明的学号是:1001
1.2.7 字典和列表的区别
dict的特点是:
(1)查找和插入的速度极快,不会随着key的增加而变慢。
(2)需要占用大量内存,内存浪费多。
list的特点是:
(1)查找和插入时间随着元素的增加而增加。
(2)占用空间小,浪费内存很少。所以,dict是使用空间换取时间。
提 示:dict内部存放的顺序和键放入的顺序没有关系。
1.3 字典方法
1.3.1 clear()方法
clear()方法用于删除字典内的所有项。clear()方法的语法如下:dict.clear()此语法中,dict代表指定字典,该方法不需要参数。该函数是一个原地操作(类似于list.sort)函数,没有任何返回值(返回值为None)。
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004'
}
stu.clear()
print("字典中的元素个数为:%d " % len(stu))
字典中的元素个数为:0
x = {'age': 10}
y = x
x = {} #重新关联到另外一个字典,这对y没有影响
y
{'age': 10}
x = {'age': 10}
y = x
x.clear() #使用clear后,y的值也被清空
y
{}
1.3.2 copy()方法
copy()方法返回一个具有相同键/值对的新字典。这个方法是浅复制(shallow copy),因为值本身是相同的,而不是副本。copy()方法的语法如下:dict.copy()此语法中,dict代表指定字典,该方法不需要参数。返回结果为一个字典的浅复制。
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004' ,
'info': ['小张','1006','man']
}
st = stu.copy()
print("赋值后得到的st为",st)
赋值后得到的st为 {'小明': '1001', '小红': '1002', '小张': '1003', '王军': '1004', 'info': ['小张', '1006', 'man']}
st['王军'] = 1005 # 替换副本的值,原始字典不受影响
print(st)
print(stu)
{'小明': '1001', '小红': '1002', '小张': '1003', '王军': 1005, 'info': ['小张', '1006', 'man']}
{'小明': '1001', '小红': '1002', '小张': '1003', '王军': '1004', 'info': ['小张', '1006', 'man']}
st['info'].remove('man') # 修改了某个值,不是替换,原始字典也会受到影响
print(st)
print(stu)
{'小明': '1001', '小红': '1002', '小张': '1003', '王军': 1005, 'info': ['小张', '1006']}
{'小明': '1001', '小红': '1002', '小张': '1003', '王军': '1004', 'info': ['小张', '1006']}
1.3.3 fromkeys()方法
fromkeys()方法用于创建一个新字典。fromkeys()方法的语法如下:dict.fromkeys(seq[, value]))此语法中,dict代表指定字典;seq代表字典键值列表;value代表可选参数,设置键序列(seq)的值。该方法返回结果为列表。
seq = ['name','age','sex','tel'] # 键值序列
info = dict.fromkeys(seq)
info
{'age': None, 'name': None, 'sex': None, 'tel': None}
1.3.4 get()方法
get()方法返回指定键的值,如果值不在字典中,就返回默认值。get()方法的语法如下:dict.get(key, default=None)此语法中,dict代表指定字典,key代表字典中要查找的键,default代表指定键的值不存在时返回默认值。该方法返回结果为指定键的值,如果值不在字典中,就返回默认值None。
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004' ,
'info': ['小张','1006','man']
}
stu.get('小明')
'1001'
1.3.5 key in dict方法
Python字典in操作符用于判断键是否存在于字典中,如果键在字典dict中就返回true,否则返回false。该方法的语法如下:key in dict此语法中,dict代表指定字典,key代表要在字典中查找的键。如果键在字典里就返回true,否则返回false。
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004' ,
'info': ['小张','1006','man']
}
# 'info' in stu True
'小强' in stu
False
1.3.6 items()方法
items()方法以列表返回可遍历的(键/值)元组数组。items()方法的语法如下:dict.items()此语法中,dict代表指定字典,该方法不需要参数。返回结果为可遍历的(键/值)元组数组。
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004' ,
}
for i in stu.items():
print(i)
('小明', '1001')
('小红', '1002')
('小张', '1003')
('王军', '1004')
1.3.7 keys()方法
keys()方法以列表返回一个字典的所有键。keys()方法的语法如下:dict.keys()此语法中,dict代表指定字典,该方法不需要参数。返回结果为一个字典的所有键。该方法使用示例如下:
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004' ,
}
for k in stu.keys():
print(k)
小明
小红
小张
王军
1.3.8 setdefault()方法
setdefault()方法和get()方法类似,用于获得与给定键相关联的值。如果键不存在于字典中,就会添加键并将值设为默认值。setdefault()方法的语法如下:dict.setdefault(key, default=None)此语法中,dict代表指定字典,key代表查找的键值,default代表键不存在时设置的默认键值。该方法没有任何返回值。
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'王军': '1004' ,
}
print(stu.setdefault('小强'))
print(stu.setdefault('小明'))
None
1001
1.3.9 update()方法
update()方法用于把字典dict2的键/值对更新到dict里。update()方法的语法如下:dict.update(dict2)此语法中,dict代表指定字典,dict2代表添加到指定字典dict里的字典。该方法没有任何返回值。
stu = {
'小明': '1001',
'小红': '1002',
'小张': '1003',
'小文': '1004' ,
}
stu1 = {
'小李': '1005',
'小王': '1006',
'小蓝': '1007',
'小熊': '1008' ,
}
stu.update(stu1)
stu
{'小张': '1003',
'小文': '1004',
'小明': '1001',
'小李': '1005',
'小熊': '1008',
'小王': '1006',
'小红': '1002',
'小蓝': '1007'}
1.3.10 values()方法
values()方法以列表形式返回字典中的所有值。与返回键的列表不同,返回的列表中可以包含重复的元素。values()方法的语法如下:dict.values()此语法中,dict代表指定字典,该方法不需要参数。返回结果为字典中的所有值。
for v in stu.values():
print(v)
1001
1002
1003
1004
1005
1006
1007
1008
1.4 字典合并与排序
有两个字典,先将字典合并,完成后对合并的字典进行排序。大体思路:
- (1)借助字典的update函数将字典合并。
- (2)准备一个将字典转化为列表的函数(知识点:字典转化为列表)。
- (3)将转化后的列表进行排序(知识点:列表排序)。
- (4)将排序好的列表转化为字典(知识点:列表转化为字典)。
def dictTolist(dic:dict):
"""将字典转化为列表"""
keys = dic.keys()
values = dic.values()
lst = [(key,val) for key,val in zip(keys,values)]
return lst
def merge_sort():
dict_one = {"2性别":"男","1姓名":"李白","5外号":"诗仙"}
dict_two = {"4派系":"浪漫主义诗人","3朝代":"唐朝","6代表作":"《蜀道难》、《将进酒》"}
dict_merge = dict()
dict_merge.update(dict_one)
dict_merge.update(dict_two)
desc_list = sorted(dictTolist(dict_merge),key=lambda x:x[0],reverse=True)
desc_dict = dict(desc_list)
asc_list = sorted(dictTolist(dict_merge),key=lambda x:x[0],reverse=False)
asc_dict = dict(asc_list)
print(f'合并的结果为:{dict_merge}')
print(f'按照第0个元素降序排列:{desc_dict}')
print(f'按照第0个元素升序排列:{asc_dict}')
print
merge_sort()
合并的结果为:{'2性别': '男', '1姓名': '李白', '5外号': '诗仙', '4派系': '浪漫主义诗人', '3朝代': '唐朝', '6代表作': '《蜀道难》、《将进酒》'}
按照第0个元素降序排列:{'6代表作': '《蜀道难》、《将进酒》', '5外号': '诗仙', '4派系': '浪漫主义诗人', '3朝代': '唐朝', '2性别': '男', '1姓名': '李白'}
按照第0个元素升序排列:{'1姓名': '李白', '2性别': '男', '3朝代': '唐朝', '4派系': '浪漫主义诗人', '5外号': '诗仙', '6代表作': '《蜀道难》、《将进酒》'}