目录
1. 映射
映射让你能够使用任何不可变的对象(最常用的是字符串和元组)来标识其元素。字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。
字典由键及其相应的值组成,这种键-值对成为项。每个键和其值之间都用冒号(:)分割,项之间用逗号分隔,而整个字典放在花括号内。在字典(以及其他映射类型)中,键必须是独一无二的。
2. 字典
可使用函数dict从其他映射(如其他字典)或键-值对序列创建字典。
相比于检查列表是否包含指定的值,检查字典是否包含指定的键的效率更高。数据结构越大,效率差距就越大。
要对字典执行字符串格式设置操作,不能使用format和命名参数,而必须使用format_map。
>>> nameAge = {"aliy":21, "ketty":24, "willy":12}
>>> "aliy's age is {aliy}".format_map(nameAge)
"aliy's age is 21"
3. 字典方法
clear:就地删除所有的字典项,什么都不返回(或者说返回None)。
copy:返回一个新字典,其包含的键-值对与原来的字典相同(浅复制,因为值本身是原件,而非副本)。
>>> user = {"usr":"admin", "passwd":['admin', 'zero', 'one']}
>>> userCpy = user.copy()
>>> userCpy['usr'] = 'better' # 替换副本中的值时原件不受影响
>>> userCpy['passwd'].remove('one') # 修改副本中的值(就地修改)时原件将发生变化
>>> userCpy
{'usr': 'better', 'passwd': ['admin', 'zero']}
>>> user
{'usr': 'admin', 'passwd': ['admin', 'zero']}
解决办法:使用模块copy中的函数deepcopy执行深复制,即同时复制值及其包含的所有值。
>>> from copy import deepcopy
>>> stud = {"name":["aliy", "bob"]}
>>> studDcp = deepcopy(stud) # 注意调用方式
>>> stud["name"].append("ketty")
>>> studDcp
{'name': ['aliy', 'bob']}
fromkeys:创建一个新字典,其中包含指定的键,且每个键对应的值都是None。
>>> dict.fromkeys(['name', 'age'], 'unknown') # 不使用默认值None,可提供指定的值
{'age': 'unknown', 'name': 'unknown'}
get:访问字典中的对应的键,如果访问的键不存在,返回指定的默认值(None),也可以提供指定的值。
items:返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式。(返回值属于字典视图的特殊类型,视图的一个优点是不复制。)
>>> iPhone = {'usr':'admin', 'country': 'HongKong', 'model': '7'}
>>> iPhone.items() # 字典视图模式
dict_items([('usr', 'admin'), ('model', '7'), ('country', 'HongKong')])
>>> list(iPhone.items()) # 列表化
[('usr', 'admin'), ('model', '7'), ('country', 'HongKong')]
keys:返回一个字典视图,其中包含指定字典中的键。
pop:获取与指定键相关联的值,并将该键-值对从字典中删除。
popitem:随机地弹出一个字典项
setfault:指定的键存在时返回其值并保持字典不变,如果指定的键不存在时则返回指定的值并相应的更新字典。
update:使用一个字典中的项来更新另一个字典。
values:返回一个由字典中的值组成的字典视图。