1.字典的性质
字典是python中唯一的映射类型,是一种工厂函数;字符串、列表、元组都是序列类型。使用key来访问字典里的内容而不是索引值。
字典包含两个要素:键(key)和值(value),他们是成对出现的,用大括号括起来,多对存在时用逗号隔开。
# dict()是一个工厂函数,调用后会生成该类型的实例
>>> a = dict()
>>> type(a)
<class 'dict'>
2.字典的增删改查
-
字典的创建
可以用dict()直接创建字典(注意不是花括号),如
>>> dict1 = dict((('F', 70),('i', 105),('s', 115),('h', 104),('C', 67)))
>>> dict1
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'C': 67}
创建一个空字典
>>> dict1 = dict()
>>> dict1
{}
-
字典的修改
改变字典中的某个值:dict2[key] = 'value',插入的方法类似
dict2 = dict(key1 = value1, key2 = value2)
最后的形式为:
dict2 = {key2:value2,key1:value}
# python的dict是无序的,注意这里的key不加引号
-
从字典中删除元素
>>> dict3 = dict((('Liu',123),('Li',456)))
>>> del dict3['Liu']
>>> dict3
{'Li': 456}
-
遍历字典
>>> dict3 = dict((('Liu',123),('Li',456)))
>>> for key, value in dict3.items():
print(key, value)
Liu 123
Li 456
3.字典的内置方法
3.1方法表格
方法 | 含义 |
---|---|
fromkeys() | 用于创建并返回一个新的字典 |
keys() | 返回键 |
value() | 返回值 |
items() | 返回键值对(也就是项) |
get(key,'value') | 对应键的值不存在的话返回一个None,这样程序就不会报错 |
key in dict1 or not in | 如果不知道一个键是否存在字典中,可以使用成员资格操作符,查找的是键而不是值 |
clear() | 清空字典,不建议使用直接赋空值的方法:dict()={} |
copy() | 浅拷贝 |
pop() | 给定键弹出相应值 |
popitem() | 给定键弹出相应项 |
setdefault() | 找不到给定键对应的值的话会自动在字典里创建一个基于该键的项(区别于get()方法的结果) |
update() | 根据一个字典或映射关系去更新另一个字典,(a.update(b):用b来更新a) |
3.2 一些方法实例
-
dict1.fromkeys()
用于创建并返回一个新的字典(并没有修改dict1,而是在它的基础上返回一个新的,可用于快速重置字典的value)。
>>> dict1 = {}
>>> dict1.fromkeys((1,2,3))
{1: None, 2: None, 3: None}
>>> dict2 = {}
>>> dict2.fromkeys((1,2,3),"Number")
{1: 'Number', 2: 'Number', 3: 'Number'}
>>> dict3 = {}
>>> dict3.fromkeys((1,2,3),("one","two","three"))
{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
fromkeys()方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,区别于(dict2 = dict1)
>>> dict1 = {}
>>> dict1.fromkeys((1,2,3))
{1: None, 2: None, 3: None}
>>> dict1
{} # dict1 并没有发生改变
-
dict1.keys()
>>> dict1 = {(1,2,3):'number'}
>>> for eachKey in dict1.keys():
print(eachKey)
(1, 2, 3)
-
dict1.copy() 浅拷贝
>>> a = {1:'one', 2:'two', 3:'three'}
>>> b = a.copy()
>>> c = a
>>> c[4] = 'four'
>>> c
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four'} # a对c赋值,对c的修改直接影响到a
>>> b
{1: 'one', 2: 'two', 3: 'three'} # 浅拷贝不会影响到原字典
-
dict1.update()
>>> a = {1:'one', 2:'two', 3:'three', 4:'four'}
>>> b = {'小白':'狗'}
>>> a.update(b)
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four', '小白': '狗'}
4.补充
(1)在字典中检查键(key)是否存在比在序列中检查指定元素是否存在更加高效,因为字典的原理是使用哈希算法存储,一步到位,不需要使用查找算法进行匹配,因此时间复杂度是O(0),效率非常高。
(2)python对键的要求相对更严格,要求它们必须是可哈希(Hash)的对象,不能是可变的类型(包括变量、列表、字典本身等)。但是python对值是没有任何限制的,它们可以是任意的python对象。
(3)收集参数时用**表示将参数们打包成字典的形式,之前介绍过以元组的形式组合。