字典
字典是一种由键值对组成的数据结构。
顾名思义,我们把键想象成字典中的单词,值想象成词对应的定义,那么一个词可以对应一个或者多个定义,但是这些定义只能通过这个词来进行查询。
基本操作
空字典可以使用{}
或者dict()
来创建一个空的字典:
a = {}
type(a)
dict
a = dict()
type(a)
dict
有了dict之后,可以用索引键值的方法向其中添加元素,也可以通过索引来查看元素的值。
插入键值:
a["one"] = "this is number 1"
a["two"] = "this is number 2"
a
{'one': 'this is number 1', 'two': 'this is number 2'}
查看键值:
a['one']
'this is number 1'
更新键值:
a["one"] = "this is number 1, too"
a
{'one': 'this is number 1, too', 'two': 'this is number 2'}
初始化字典
可以看到,Python使用key: value这样的结构来表示字典中的元素结构,事实上,可以直接使用这样的结构来初始化一个字典:
b = {'one': 'this is number 1', 'two': 'this is number 2'}
b['one']
'this is number 1'
print(a)
{'one': 'this is number 1, too', 'two': 'this is number 2'}
字典没有顺序
Python中不能用支持用数字索引按顺序查看字典中的值,而且数字本身也有可能成为键值,这样会引起混淆:
a[0]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
Input In [13], in ()
----> 1 a[0]
KeyError: 0 |
键必须是不可变的类型
字典是一种高效的存储结构,其内部使用基于哈希值的算法,用来保证从字典中读取键值对的效率。不过,哈希值算法要求字典的键必须是一种不可变类型。使用可变类型作为键时,Python会抛出异常,例如:
a[[1, 2]] = 1
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [14], in ()
----> 1 a[[1, 2]] = 1
TypeError: unhashable type: 'list' |
适合做键的类型
在不可变类型中,整数和字符串是字典中最常用的类型;而浮点数通常不推荐用来做键,原因如下:
data = {}
data[1.1 + 2.2] = 6.6
data[3.3]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
Input In [17], in ()
----> 1 data[3.3]
KeyError: 3.3 |
这个错误是由浮点数的精度问题所引起的:
data
{3.3000000000000003: 6.6}
也可以使用元组作为键值,例如,可以用元组做键来表示从第一个城市飞往第二个城市航班数的多少:
connections = {}
connections[('New York', 'Seattle')] = 100
connections[('Austin', 'New York')] = 200
connections[('New York', 'Austin')] = 400
元组是有序的,因此 ('New York', 'Austin') 和 ('Austin', 'New York') 是两个不同的键:
connections[('Austin', 'New York')]
200
connections[('New York', 'Austin')]
400
字典方法
用.get()
方法替代索引处理值不存在的情况:
a = {}
a["one"] = "this is number 1"
a["two"] = "this is number 2"
值不存在时,get
方法返回一个默认值,不指定时,该默认值为None
a.get("three")
传入默认值:
a.get("three", "undefined")
'undefined'
存在时,与调用索引相同:
a.get("one")
'this is number 1'
与列表一样,del 函数可以用来删除字典中特定的键值对,例如:
del a["one"]
.update()
方法可以更新键值对:
person = {}
person['first'] = "Jmes"
person['last'] = "Maxwell"
person['born'] = 1831
person
{'first': 'Jmes', 'last': 'Maxwell', 'born': 1831}
person_modifications = {'first': 'James', 'middle': 'Clerk'}
person.update(person_modifications)
person
{'first': 'James', 'last': 'Maxwell', 'born': 1831, 'middle': 'Clerk'}
in查询字典中是否有该键:
barn = {'cows': 1, 'dogs': 5, 'cats': 3}
'chickens' in barn
False
'cows' in barn
True
.keys()
,values()
,items()
方法分别返回字典的键,值,键值对:
barn.keys()
dict_keys(['cows', 'dogs', 'cats'])
barn.values()
dict_values([1, 5, 3])
barn.items()
dict_items([('cows', 1), ('dogs', 5), ('cats', 3)])
.setdefault()
方法接受两个参数:key和default,如果key在字典中,返回其对应的值,如果不存在,则先用default的值对key进行插入,并返回default。其中default的值可以省略,默认值为None:
barn.setdefault("chickens", 4)
4
barn
{'cows': 1, 'dogs': 5, 'cats': 3, 'chickens': 4}