在Python中使用dictionary
- 提到Dictionary,或者哈希表,你一定不会陌生,简单来说,就是用某种形式的值,而不是元素的位置去索引内容的数据结构。这种值,叫做key,而索引到的内容,叫做value。
创建dictionary
首先,来看如何创建dictionary,我们用{key:value}这样的形式直接指定值就好了:
empty = {}
user = {"email": "11@boxue.io", "workId": 11}
这样,我们就创建了一个空的和一个包含两个key的dictionary。实际上,和tuple类似,我们还可以使用dict关键字来创建dictionary:
empty = dict()
user = dict({"email": "11@boxue.io", "workId": 11})
但是,hmm.. 我是觉得没什么必要这样,大家只要选择一种自己习惯的方法,一直用下去也就是了。
访问dictionary中的元素
创建好dictionary之后,就可以访问它的内容了。形式上和list类似,只不过我们获取value的索引不再是位置,而是要访问的key:
user = dict({"email": "11@boxue.io", "workId": 11})
print(user['email'])
# 11@boxue.io
但是,和其他语言不同的是,在Python里,访问一个不存在的Key是不合法的行为,会导致运行时错误,例如:
print(user['address'])
'''
Traceback (most recent call last):
File "/Users/puretears/Desktop/tmp/CollectionsTypes/CollectionTypes.py", line 6, in <module>
print(user['address'])
KeyError: 'address'
'''
更新dictionary
实际上,除了用上面的方式访问dictionary中的元素外,还可以直接修改对应的key:
user['email'] = '10@boxue.io'
这时,如果我们给一个不存在的key赋值,就相当于给dictionary添加新元素:
user['address'] = "Beijing xxxxx"
这样,当我们再访问user['address']的时候,就不会再有运行时错误了。除了使用下标操作符之外,我们还可以使用update方法:
user.update({'address': 'Beijing xxxxxx'})
使用update的一个好处就是,当我们需要给dictionary添加多个key-value的时候,会比较方便。当我们要添加或者更新一个key的时候,还是坚持使用下标操作符的版本就好了。
删除dictionary中的元素
和之前讲过的两种集合类型一样,我们也可以使用del函数直接删除dictionary中的元素:
del(user['address'])
或者,删掉整个dictionary:
del(user)
无论是删掉的元素还是dictionary,再访问它们的时候,就会发生运行时错误。如果,你只是想清空dictionary,可以使用clear方法:
user.clear()
这样,user对象还在,只不过所有的key-value都没有了。
了解Key类型的限制
在Python里,尽管我们可以让任何类型的对象作为dictionary中的value,但key并不如此。它有两个限制:
- 首先,Key必须是唯一的,因此,下面的定义是错误的:
user = dict({"email": "11@boxue.io", "workId": 11, "workId": 10})
print(user)
# {'email': '11@boxue.io', 'workId': 10}
虽然,从打印的结果来看,会采用相同key的最后一个value,但是,不要在dictionary的定义中使用相同的Key。
- 其次,Key必须是只读的,因此,字符串、数字、Tuple都可以作为key,但是list却不可以:
user = dict({"email": "11@boxue.io", "workId": 11, (11, 1101): "Floor&Room"})
# This works
user = dict({"email": "11@boxue.io", "workId": 11, [11, 1101]: "Floor&Room"})
# This is wrong
'''
Traceback (most recent call last):
File "/Users/puretears/Desktop/tmp/CollectionsTypes/CollectionTypes.py", line 4, in <module>
user = dict({"email": "11@boxue.io", "workId": 11, [11, 1101]: "Floor&Room"})
TypeError: unhashable type: 'list'
'''
其它常用的dictionary操作
除了我们之前介绍过的集合类型操作之外,dictionary基于它自身的特性,还有一些属于它自己的方法:
首先,是单独获取dictionary的所有keys和values,它们的类型,都是list:
user = dict({"email": "11@boxue.io", "workId": 11})
print(user.keys())
# dict_keys(['email', 'workId'])
print(user.values())
# dict_values(['11@boxue.io', 11])
其次,判断dictionary中是否包含某个key:
print("email" in user)
# True
当然,我们也可以这样:
print("email" in user.keys())
# True
虽然得到的结果是一样的,但是,在Python 3中,应该坚持使用第一种方式判断dictionary是否包含某个key,它比第二种方法要快的多。就像我们刚才提到的,Python 3中的keys()返回的是一个dict_keys对象。当我们使用in操作符的时候,处理dictionary,要比处理dict_keys对象更快。