字典
字典 ( dictionary ) 采用 0 个或多个键值对(key-value)的形式存储数据。Python 对 key 进行哈希函数运算,根据计算的结果决定 value 的存储地址,所以是无序组合数据类型,且 key 必须是可哈希的。可哈希的 key 必须是不可变类型,如:数字、字符串、元组。
字典是除列表以外 Python 之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是可变的,因此可以对其进行数据项的添加或移除操作。
注意: 从 Python 3.6 开始,字典的 Key 将会保留插入或声明时候的顺序,但并不是可以被排序的那种顺序。从 3.7 开始这成了正式的 Python 语言特性,3.6 改进的字典更节省内存,运行效率差不多,有一个 “副作用” 就是字典变成有序的了。
字典的创建
dict
数据类型可以作为函数调用:dict()
——不带参数将返回一个空字典,带一个映射类型参数将返回以该参数为基础的字典。比如该参数本身为字典,则返回该参数的浅拷贝。使用序列型参数也是可以的,前提是序列中的每个数据项本身是一个包含两个对象的序列,其中第一个用作键,第二个用作值。
字典也可以使用花括号 {}
创建——空的 {}
会创建空字典,非空的 {}
必须包含一个或多个逗号分隔的项,其中每一项都包含一个键、一个字面意义的冒号以及一个值:
1 | dic1 = { |
字典的操作
字典支持内置的 len()
函数,也可以使用 in
与 not in
对其键进行快速的成员关系测试
方法
语法 | 表述 |
---|---|
d.clear() | 将字典d清空 |
d.copy() | 返回字典d的浅拷贝 |
d.fromkeys(s,v) | 返回一个字典,该字典的键为序列s的项,值为None或v(r如果给定了参数v) |
d.get(k) | 返回字典d中键k对应的值,如果k不在d中就返回None |
d.get(k,v) | 返回字典d中键k对应的值,如果k不在d中就返回预设值v |
d.items() | 返回字典d中所有 键-值 对的视图 |
d.keys() | 返回字典d中所有的键的视图 |
d.values() | 返回字典d中所有值的视图 |
d.pop(k) | 移除键为k的项并返回键k对应的值,如果k不在d中就产生KeyError异常 |
d.pop(k,v) | 移除键为k的项并返回键k对应的值,如果k不在d中就返回预设值v |
d.popitem() | 随机移除并返回字典d中的任意一个 键-值 对,如果d为空就产生KeyError异常 |
d.setdefault(k,v) | 与d.get()类似,不同之处在于,如果键k不在d中就插入一个键为k的新值,其值为None或预设值v(如果给定了参数v) |
d.update(a) | 如果a中的键-值 对不存在d中就添加到d,如果a中的键在d中,就将a中的键对应的值替换掉d中键对应的值。a可以是字典,也可以是关键字参数 |
示例
增加元素,字典的键是独一无二的,因此如果向字典中添加一个键-值项,并且该键与字典中现存的某个键相同,那么实际的效果是使用新值替换该键的现值。
1 | dic1 = {} |
查找元素
1 | dic1 = {'name': 'Tom', 'age': 18, 'sex': 'male', 'hobby': 'Jerry'} |
修改数据
1 | dic1 = {'name': 'Tom', 'age': 18, 'sex': 'male', 'hobby': 'Jerry'} |
删除
1 | dic1 = {'name': 'Tom', 'age': 18, 'sex': 'male', 'hobby': 'Jerry'} |
其他操作:
dict.fromkeys
1 | d1 = dict.fromkeys(['host1', 'host2', 'host3'], 'Mac') |
字典的嵌套
1 | province_city = { |
sorted(dict) : 返回一个有序的包含字典所有 key 的列表 。
1 | dic = {5: '555', 2: '666', 4: '444'} |
字典的遍历
字典的 itmes 指的是键值对,在遍历的时候存在一个转换过程,因此如果数据量大的情况下效率比较低,不建议采用这种方法迭代,而建议使用 for k in dic:
的方法遍历。
1 | dic5={'name': 'tom', 'age': 18} |
判断字典中有没有某个 key
要判断字典中是否有某个键 k
,一般使用 dic.get('k')
的方法来实现。
1 | 'name': 'Jerry', 'sex': 'male'} dic = { |
但是如果字典中的键 k
所对应的值是 None
的时候就会出现严重的问题,这时候就会认为没有这个键 k
。例如:
1 | 'name': 'Jerry', 'sex': 'male', 'hobby': None} dic = { |
为了避免这种情况影响到程序的判断,应该使用成员判断操作符 in
的方法。
1 | "hobby" in dic |
但是多数情况下除了判断字典中是否有对应的键,还有可能需要操作键所对应的值。所以,使用 for k in dic:
的方法遍历字典是最为合适的。
1 | 'name': 'Jerry', 'sex': 'male', 'hobby': None} dic = { |