Python学习笔记 - dict 字典

字典的 key

字典是 python 中唯一的映射类型,采用键值对(key-value)的形式存储数据。python 对 key 进行哈希函数运算,根据计算的结果决定 value 的存储地址,所以字典是无序存储的,且 key 必须是可哈希的。可哈希表示 key 必须是不可变类型,如:数字、字符串、元组、不可变集合。(即:元组和不可变集合可以作为字典的 key 而列表和可变集合不行)

创建字典

在 python 中,{} 代表了字典和集合,单一空 {} 与采用键值对的 {key: value} 代表字典,其中的元素以逗号分隔,key 可以采用数字、字符串、元组(采用变量作为 key 等价于采用此变量的值作为 keykey 值不会因为变量的改变而改变),而 value 可以使用任意的数据类型。

1
2
3
4
5
6
7
a = {} # 创建空字典
a = {'a': 1, 1: 'b'} # 字典的 key 与 value 的数据类型均可不同
a = {(1, 2, 3): True} # 字典的 key 可以采用元组(不可以使用列表和集合)
a = {'a': {}, 'b': []} # 字典的 value 可以嵌套
a = {'a': 1, 'b':2, 'a':3} # a = {'a': 3, 'b':2},键重复只保留最后一个此健对应的值
a = dict([['a', 1], ['b', 2]]) # a = {'a': 1, 'b': 2},采用工厂函数创建,不常用
a = dict.fromkeys([1, 3, 'q'],'ex') # a = 1: 'ex', 3: 'ex', 'q': 'ex'},创建一个键不同但拥有相同值的字典

Todo: 深浅拷贝

1
2
3
4
5
6
a = dict.fromkeys(['m', 'n', 'o'], ['test1', 'test2']) 
# a = {'m': ['test1', 'test2'], 'n': ['test1', 'test2'], 'o': ['test1', 'test2']}
a['m'][1] = 'test3'
# a = {'m': ['test1', 'test3'], 'n': ['test1', 'test3'], 'o': ['test1', 'test3']}
# 而不是
# a = {'m': ['test1', 'test3'], 'n': ['test1', 'test2'], 'o': ['test1', 'test2']}
1
2
a = {...}
b = a.copy() # 对字典 a 进行浅复制,返回一个和 a 有相同键值对的新字典

获取元素

1
2
3
4
5
a = {'m': 1, 'k': 2}
m = a['m'] # m = 1,直接在中括号中传入键值即可
m = a.get('m') # m = 1
m = a.get('p') # m = None,通过 get 方法获取元素时,如果此 key 不存在会返回 None
m = a.get('p', 9) # m = 9,通过 get 方法获取不存在的元素时,可以传入一个参数,当不存在时返回

元素 keys values items 获取

1
2
3
4
a = {'m': 1, 'k': 2, 'p': 3, 'l': 4}
k = a.keys() # k = dict_keys(['m', 'k', 'p', 'l']),获取所有的 key 组成的列表所包装成的对象,可以通过 list 函数转换为列表
v = a.values() # v = dict_values([1, 2, 3, 4]),获取所有的 value 组成的列表所包装成的对象,可以通过 list 函数转换为列表
i = a.items() # i = dict_items([('m', 1), ('k', 2), ('p', 3), ('l', 4)]),获取所有的 (key, value) 元组组成的列表所包装成的对象,可以通过 list 函数转换为列表

判断是否有指定键

1
2
3
a = {'c': 1, 'm': 2, 'y': 3, 'k': 4}
'm' in a # True
't' in a # False

添加元素

1
2
3
4
5
a = {}
a['m'] = 1 # a = {'m': 1},可以通过直接传入新 key 而添加元素
t = a.setdefault('k', 2) # t = 2, a = {'m': 1, 'k': 2},添加一个新元素并返回新元素的值
t = a.setdefault('m', 2) # t = 1, a = {'m': 1, 'k': 2},若健已存在,则不会修改元素的值并返回元素原来的值
a.update({'p': 3, 'l': 4}) # a = {'m': 1, 'k': 2, 'p': 3, 'l': 4},通过传入一个新字典来插入元素

修改元素

1
2
3
a = {'m': 1, 'k': 2, 'p': 3}
a['m'] = 2 # a = {'m': 2, 'k': 2, 'p': 3},修改指定索引对应的元素
a.update({'m': 1, 'k': 3}) # a = {'m': 1, 'k': 3, 'p': 3},通过传入另一个字典来修改字典的值

删除元素

1
2
3
4
5
6
7
a = {'m': 1, 'k': 2, 'p': 3}
x = a.pop('k') # x = 2, a = {'m': 1, 'p': 3},删除制定索引的元素并返回它
del a['m'] # a = {'p': 3},删除指定索引的元素
a = {'m': 1, 'k': 2, 'p': 3}
x = a.popitem() # x = ('p', 3), a = {'m': 1, 'k': 2},随机删除一对值并返回
a.clear() # a = {},清空字典中全部元素
del a # a不再存在,删除字典,直接取消了定义

字典排序

字典的排序是按照 key 值进行排序,返回的是按照字典的 key 值排序所组成的列表

1
2
dic = {'he': 1, 'she': 2 ,'that': 3}
s = sorted(dic) # s = ['he', 'she', 'that']

字典遍历

直接循环只遍历 key 值

1
2
3
4
5
6
7
8
9
a = {'m': 1, 'k': 2, 'p': 3}
for i in a:
print(i)
'''
输出结果为:
m
k
p
'''

这时应该采用下面的方式获取键对应的值

1
2
3
4
5
6
7
8
9
a = {'m': 1, 'k': 2, 'p': 3}
for i in a:
print(i, a[i])
'''
输出结果为:
m 1
k 2
p 3
'''

或者采用 .items() 方法来获取所有内容

1
2
3
4
5
6
7
8
9
a = {'m': 1, 'k': 2, 'p': 3}
for key, value in a.items():
print(key, value)
'''
输出结果为:
m 1
k 2
p 3
'''

应该注意,只遍历键的效率较高,因此建议采用第一种方式进行遍历