dict类相当于哈希表,对于每个key值都有一个value值与之对应,构造如下
dict = {key1:value1,key2:value2,key3:value3,…}
构造一个dic对象的方法如下
1.直接构造
d1 = {1:‘hello’,2:‘world’,‘a’:‘some value’}
这种构造方法仅适用key-value对较少且事先知道的情况。在有了一个dict对象后,我们可以直接通过key得到value:
Input: d1[‘a’]
Output: d1[‘a’] = ‘some value’
Input: d1[1]
Output: d1[1] = ‘hello’
我们还可以在原有的dict对象中添加key-value对
Input: d1[‘b’] = 666
Input: d1
Output: d1 = {1:‘hello’,2:‘world’,‘a’:‘some value’,‘b’:666}
也能够改变原有的key-value对
Input: d1[2] = ‘China’
Input: d1
Output: d1 = {1:‘hello’,2:‘China’,‘a’:‘some value’,‘b’:666}
还能够删除原有key-value对
Input: del d1[‘b’]
Input: d1
Output: d1 = {1:‘hello’,2:‘China’,‘a’:‘some value’}
以上的添加,修改,访问操作都是通过类似于数组索引的方式实现的,我们完全可以
将一个dict对象看成是一个普通的一维数组,key就相当于数组下标,通过该“下标”访问,修改,添加元素。
2.利用已有序列
假如我们已有两个tuple类对象,first_name = (‘David’,‘Tom’,‘Jack’),
second_name = (‘Green’,‘Black’,‘White’),我们想利用这两个tuple对象生
成一个dict对象,使得两个tuple对象中元素按照顺序组成一个key-value对,我们
应该如何做?
一种方法是利用zip函数,该函数可将多个list,tuple或其他序列中的元素按照顺序配对为一个tuple,最后得到一个tuple序列,例如:
Input: list(zip(first_name,second_name))
Output: [(‘David’,‘Green’),(‘Tom’,‘Black’),(‘Jack’,‘White’)]
通过zip函数,我们实现了key和value的“捆绑”,我们只需可以通过遍历这个“捆绑”序列实现dict对象的生成,代码如下
mapping = {} #声明一个空的dict对象
for key,value in zip(first_name,second_name): #利用tuple可拆分的性质
mapping[key] = value
实际上,dict就是一个二元tuple序列,每个key-value对本质上是一个有两个元素的tuple对象,我们可以直接利用dict进行二元tuple序列到dict对象的类型转换
mapping = dict(zip(first_name,second_name))
可以得到 mapping = {‘David’:‘Green’,‘Tom’:‘Black’,‘Jack’:‘White’}
总之,我们可以利用二元tuple序列得到dict对象,而二元tuple序列可通过zip合并
两个序列(list,tuple等)得到
对key,value类型的说明
在生成一个dict对象时,value的类型没有限制,可以是python中的任意类型,我们可以通过setdefault函数以及collection库中的defaultdict函数指定value的类型。
words = ['apple','bread','banana','atom','coke']
#我们现在想要将单词的首字母作为key,所有首字母相同的单词放在一起作为value
#这意味着value的类型应当是list,这样就才能够将多个单词集合在一起,同时能够动态
#添加新的单词,我们可以通过如下代码实现该功能
by_letter = {}
for word in words:
letter = word[0]
by_letter.setdefault(letter,[]).append(word)
#如果value的类型统一,比如都为list,我们还可以用defaultdict统一指定类型,上例
#中的setdefault只是给一些特定的(根据letter)value指定了类型为list(第二个参
#数'[]'
from collections import defaultdict
by_letter = defaultdict(list)
for word in words
by_letter[word[0]].append(word)
key的类型限定为immutable,满足条件称为hashable,为hashable的类型有string,tuple等,如果想知道某个对象能否作为key,可进行如下操作
hash('haha') #可以作为key
hash((1,2,3)) #可以作为key
hash({1,2,3}) #无法作为key
总结
1.生成一个dict对象的方法有两种,一种是直接构造,一种是利用已有的二元tuple序列。
2.key的类型只能是immutable类型,可通过hash函数查看一个一个对象能否作为key。
3.value的类型可以是python中的任意类型,可以通过setdefault函数指定多对key-value对中value的类型,在所有key-value对中value类型相同的情况下,可以使用collections库中的defaultdict函数。