字典是拥有灵活尺寸的键值对集合,类似哈希表或者关联数组。
1.生成方法
#使用{}创建字典
In[2]: d1 = {'a': 'some', 'b': [1, 2]}
#enumerate方法追踪索引生成字典
In[1]: list = ['foo', 'bar', 'baz']
In[2]: mapping = {}
In[3]: for i, value in enumerate(list):
.....: mapping[value] = i
In[4]: mapping
Out[1]: {['bar':1, 'baz': 2, 'foo':0]} #其获得的序列对于字典和集合,会重新排序,对于元组和列表,会保list原有顺序
#zip方法实现两个序列按元素配对
In[1]: mapping = {}
In[2]: for key, value in zip(range(5), reversed(range(5)):
.....: mapping[key] = value
Out[1]: {0: 4, 1: 3, 2: 2, 3: 1, 4: 0}
#dict方法也可实现两序列配对的目的
In[1]: mapping = dict(zip(range(5), reversed(range(5))))
In[2]: mapping
Out[1]: {0: 4, 1: 3, 2: 2, 3: 1, 4: 0}
2.对字典的修改
字典使用字典键插入、访问或设置元素,使用del 关键字或pop 方法删除值,使用keys、values方法提供字典键、值的迭代器,使用update方法合并两个字典。
#字典的插入、设置及访问
In[1]: d1 = {'a': 'some', 'b': [1, 2]}
In[2]: d1[7] = 'int'
In[3]: d1
Out[1]: {'a': 'some', 'b': [1, 2], 7: 'int'} #插入字典尾
In[4]: d1['a']
Out[2]: 'some'
In[5]: d1['b'] = [1, 2, 3]
In[6]: d1
Out[3]: {'a': 'some', 'b': [1, 2, 3], 7: 'int'}
#del关键字删除值
In[1]: d1 = {'a': 'some', 'b': [1, 2]}
In[2]: del d1['a']
In[3]: d1
Out[1]: {'b': [1, 2]}
#pop方法删除值,同时返回该值
In[1]: d1 = {'a': 'some', 'b': [1, 2]}
In[2]: s = d1.pop['a']
In[3]: d1
Out[1]: {'b': [1, 2]}
In[4]: s
Out[2]: 'some'
#keys、values方法迭代器
In[1]: d1 = {'a': 'some', 'b': [1, 2]}
In[2]: list(d1.keys())
Out[1]: {'a', 'b'}
In[3]: list(d1.values())
Out[2]: {'some', [1, 2]}
#update方法合并两个字典,相当于使用+号进行连接,但对于已存在的键,其值会被覆盖
In[1]: d1 = {'a': 'some', 'b': [1, 2]}
In[2]: d1.update({'b': 'int', 'c': [5, 6]})
In[3]: d1
Out[1]: {'a': 'some', 'b': 'int', 'c': [5, 6]}
3.字典的默认值
字典的get方法和pop方法可以返回一个默认值,setdefault方法可以将列表根据规定的键分类为字典,而defaultdict方法可以生成符合要求的字典。
#带有默认值的get方法在key参数不是字典的键时返回None
value = dict.get(key, default_value)
#pop方法在key参数不是字典的键时抛出异常
value = dict.pop(key)
等价于以下代码段
if key in dict:
value = dict[key]
else:
value = default_value
#setdefault方法对列表进行转换
In[1]: a = ['apple', 'bat', 'bar']
In[2]: dict = {}
In[3]: for value in a:
.....: i = value[0]
.....: dict,setdefault(i, []).append(value)
In[4]: dict
Out[1]: {'a': 'apple', 'b': 'bat', 'bar'}
等价于以下代码段
In[1]: a = ['apple', 'bat', 'bar']
In[2]: dict = {}
In[3]: for value in a:
.....: i = value[0]
.....: if i not in dict:
.....: dict[i] = [value]
.....: else:
.....: dict[i].append(value)
In[4]: dict
Out[1]: {'a': 'apple', 'b': 'bat', 'bar'}
#defaultdict方法与之类似,但更为简便
from collections import defaultdict
dict = defaultdict(list)
for value in a:
dict[value[0]].append(value)
4.有效的字典键类型
字典值的可以是任意的Python对象,但字典键必须是不可变的对象,哈希化可以判断一个对象是否可以作为字典键。
#元组只要内部元素都可以哈希化,它自己也就可以哈希化
In[1]: hash((1, 2, (2, 3)))
Out[1]: 1097636502276347782
In[2]: hash((1, 2, [2, 3])) #列表可变,不可哈希化,会报错