Python字典

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))