1. 字典概述
字典是Python基本数据结构——映射。字典包含了一个索引的集合,被称为键 (keys),和一个值 (values) 的集合。字典中的值存储在键下,不按顺序排列,键几乎可以是任意类型。
一个键对应一个值。这种一一对应的关联被称为键值对 (key-value pair) ,有时也被称为项 (item)。
2. 使用字典的一些经验
2.1 copy() 和 deepcopy()
当替换副本中的值时,原件不受影响。然而,如果
修改副本中的值(就地修改而不是替换),原件也将发生变化,
因为原件指向(引用)的也是被修改的值(如这个示例中的'machines'列表所示)。
>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']} >>> y = x.copy() >>> y['machines'].insert(1,1001) >>> y {'username': 'mlh', 'machines': ['foo', 1001, 'bar', 'baz']} >>> x {'username': 'admin', 'machines': ['foo', 1001, 'bar', 'baz']}
为避免这种问题,可使用模块copy中的函数deepcopy。deepcopy 执行深复制,即同时复制值及其包含的所有值。
>>> from copy import deepcopy >>> d = {} >>> d['names'] = ['Alfred', 'Bertrand'] >>> c = d.copy() >>> dc = deepcopy(d) >>> d['names'].append('Clive') >>> c {'names': ['Alfred', 'Bertrand', 'Clive']} >>> dc {'names': ['Alfred', 'Bertrand']}
2.2 get() 方法
方法get为访问字典项提供了宽松的环境。通常,如果你试图访问字典中没有的项,将引发错误。而使用get不会这样,这在进行字典值计算操作时不希望引发错误(用0代替,忽略不存在项)时特别有用
>>> d = {} >>> print(d['score']) Traceback (most recent call last): File "<pyshell#38>", line 1, in <module> print(d['score']) KeyError: 'score' >>> print(d.get('name',0)) 0 >>> d {}
2.2 keys() 方法
方法keys返回一个字典视图,视图包含指定字典中的键。可以对字典视图进行并集操作(像集合操作一样),结果是一个集合
>>> a = {1:1, 2:2} >>> b = {3:3, 4:4} >>> a.keys()|b.keys() # 结果是集合,说明字典的键是唯一 {1, 2, 3, 4}
3. 字典常用方法及代码实践(源自《Python编程快速上手 让繁琐工作自动化》)
# (字典)更新字典物品清单.py ''' 假设征服一条龙的战利品表示为这样的字符串列表: dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] 写一个名为 addToInventory(inventory, addedItems)的函数, 其中 inventory 参数 是一个字典, 表示玩家的物品清单(像前面项目一样), addedItems 参数是一个列表, 就像 dragonLoot。 addToInventory()函数应该返回一个字典, 表示更新过的物品清单。 ''' # 意思是先更新字典再调用打印字典的函数 items = {'gold coin': 42, 'rope': 1} dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] def displayInventory(dict_item): print('Inventory') for i,j in dict_item.items(): print(i,j) print('Total number of items: {}'.format(sum(value for key,value in dict_item.items()))) def addToInventory(inventory, addedItems): update_dict = {} temp = {} for i in set(addedItems): temp.setdefault(i, addedItems.count(i)) for key in temp.keys() | inventory.keys(): # 字典视图支持并集运算 update_dict[key] = sum(d.get(key,0) for d in (temp,inventory)) # 此用get比用键值访问字典项好,for表明了可迭代的对象,可用sum,但元组内的通道符|不能再用,因为'temp|inventory'pyhton 不支持 return update_dict if __name__ == '__main__': displayInventory(addToInventory(items, dragonLoot))