Django 2.0 入门与实践
上QQ阅读APP看书,第一时间看更新

2.6 Dictionary类型

字典(Dictionary)是一种数据结构,它像列表一样存储多个元素,每个元素都包含一个键(Key)和值(Value),其中键是不能重复的,而值是可以重复的。字典中的键-值对没有特定的存储顺序,读者可以通过键来快速得到对应的值,这与通过书籍目录来快速查找章节一样。

Python中的字典使用大括号“{}”表示,其中的键-值对使用冒号分隔,键值对之间使用逗号分隔,例如:

    >>> roomnumber = {"Aaron":"0001", "Tom":"0002", "Kate":"0003"}

2.6.1 访问字典元素

刚才讲到字典中的键类似于数据的目录,所以可以通过键来查找元素值,方法如下:

    >>> roomnumber["Aaron"]
    '0001'

如果访问的键不存在,会输出错误:

    >>> roomnumber["Richard"]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'Richard'

2.6.2 检查字典中是否存在某个键

    >>> "Aaron" in roomnumber
    True
    >>> "Jack" in roomnumber
    False

2.6.3 修改字典

1. 添加键-值对

可以通过访问字典值的方式添加键-值对,虽然字典中并不存在该键,但是字典会自动增加一个键-值对,如修改前面例子如下:

    >>> roomnumber["Richard"]="0004"
    >>> roomnumber
    {"Aaron":"0001", "Tom":"0002", "Kate":"0003", "Richard":"0004"}

2. 删除一个键-值对

    >>> del roomnumber["Kate"]
    >>> roomnumber
    {"Aaron":"0001", "Tom":"0002", "Richard":"0004"}

3. 修改一个键关联的值

    >>> roomnumber["Richard"]="0003"
    >>> roomnumber
    {"Aaron":"0001", "Tom":"0002", "Richard":"0003"}

2.6.4 字典方法

1. clear

用于清空字典中的所有项,该方法不返回任何内容:

    >>> roomnumber.clear()
    >>> roomnumber
    {}

2. copy

在讲解这个方法之前,先了解两个概念:浅拷贝和深拷贝。

对于可变对象如列表、字典,直接赋值时只会将一个对象的引用传递给另一个对象,此时修改其中一个对象就会改变另一个对象,如:

    >>> a = [1,2,3]
    >>> b = a
    >>> a,b
    ([1, 2, 3], [1, 2, 3])
    >>> a[0]=100
    >>> a,b
    ([100, 2, 3], [100, 2, 3])

大多数情况下,一个可变对象内还可以嵌套其他可变对象,此时浅拷贝只会拷贝顶级对象,而对于嵌套的对象,只会拷贝它的引用,所以修改顶级对象不会影响另一个对象,但是如果修改嵌套的对象就会影响两个对象了:

    >>> a = [1,2,3, ["Aaron", "Tom"]]
    >>> b = a.copy()
    >>> a,b
    ([1, 2, 3, ['Aaron', 'Tom']], [1, 2, 3, ['Aaron', 'Tom']])
    >>> a[1]=100
    >>> a,b
    ([1, 100, 3, ['Aaron', 'Tom']], [1, 2, 3, ['Aaron', 'Tom']])
    >>> b[3][1]="Jacky"
    >>> a,b
    ([1, 100, 3, ['Aaron', 'Jacky']], [1, 2, 3, ['Aaron', 'Jacky']])

由此可见,在浅拷贝的情况下修改顶级元素不会影响另一个对象,但是修改内部可变元素时就会同时修改原始对象与新对象了,为了解决这个问题字典提供了一个深拷贝方法。深拷贝就是将顶级对象以及子对象的值同时拷贝给新对象,此时修改任何一个都不会影响另一个。

由于字典也是可变对象,所以copy方法也遵循以上原则。

如果想对字典进行深拷贝操作,需要引用copy包中的deepcopy方法:

    >>> from copy import deepcopy
    >>> a = {"Aaron":"0001", "Tom":"0002", "Kate":"0003", "Richard":"0004"}
    >>> b = deepcopy(a)
    >>> a,b
    ({'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}, {'Aaron':
    '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'})
    >>> a["Aaron"]="1"
    >>> a,b
    ({'Aaron': '1', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}, {'Aaron':
    '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'})

3. fromkeys

使用给定的一些键创建一个新的字典,所有键对象的值为None。

    >>> {}.fromkeys(["name", "age"])
    {'name': None, 'age': None}

如果不想用None来作为默认值,也可以给定其他值:

    >>> {}.fromkeys(["length", "width", "height"], 0)
    {'length': 0, 'width': 0, 'height': 0}

4. get

访问一个字典项,如果试图访问的字典项不存在时返回None,也可以返回其他值,对字典本身没有任何影响:

    >>> a = {"Aaron":"0001", "Tom":"0002", "Kate":"0003", "Richard":"0004"}
    >>> a.get("Aaron")
    '0001'
    >>> a.get("Jacky")
    >>> a
    {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}
    >>> a.get("Jacky", "N/A")
    'N/A'
    >>> a
    {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}

5. items

items会将字典中的所有项以列表的方式返回,返回时没有特殊顺序:

    >>> a = {"Aaron":"0001", "Tom":"0002", "Kate":"0003", "Richard":"0004"}
    >>> a.items()
    dict_items([('Aaron', '0001'), ('Tom', '0002'), ('Kate', '0003'), ('Richard',
    '0004')])

6. keys

将字典中的键以列表的形式返回:

    >>> a.keys()
    dict_keys(['Aaron', 'Tom', 'Kate', 'Richard'])

7. values

将字典中的值以列表的形式返回:

    >>> a.values()
    dict_values(['0001', '0002', '0003', '0004'])

8. pop

删除一个键-值对并返回对应的值:

    >>> a = {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}
    >>> a.pop("Richard")
    '0004'
    >>> a
    {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003'}

9. popitem

随机删除一个字典项并返回:

    >>> a.popitem()
    ('Kate', '0003')
    >>> a
    {'Aaron': '0001', 'Tom': '0002'}

10. setdefault

与get方法基本一致,唯一的区别就是当键不存在时,setdefault方法会创建一个新字典项:

    >>> a.setdefault("Lisa", "0005")
    '0005'
    >>> a
    {'Aaron': '0001', 'Tom': '0002', 'Lisa': '0005'}

11. update

根据一个字典项更新字典,如果字典项在原始字典中不存在则在字典中添加该项:

    >>> a.update({"Lisa":"0003"})
    >>> a
    {'Aaron': '0001', 'Tom': '0002', 'Lisa': '0003'}
    >>> a.update({"Tracy":"0004"})
    >>> a
    {'Aaron': '0001', 'Tom': '0002', 'Lisa': '0003', 'Tracy': '0004'}