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函数。