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代表作': '《蜀道难》、《将进酒》'}