“字典”是Python语言中最重要的三种数据类型(字符串、列表、字典)之一,它的用处很多,本身的功能也很强大。实际上,三种最基本的数据类型用途都很广泛,功能都很强大。但Python字典不同于其它两种类型的是,它通过名称而不是索引来访问其中的各个值。其是一种可以称为“映射”的数据结构,也是Python中唯一的内置映射类型。
“字典”的名称即指出了这种数据结构的用途。普通图书适合按照从头到尾的顺序阅读,当然,如果我们愿意,也可快速翻到想要的某一页,这有点像Python中的列表。日常生活中的字典通常作为工具书来用,能够让我们轻松地找到特定的单词,以获悉单词的定义。Python字典能够帮助我们快速地找到想要的“键”,从而获得其相应的“值”。
Python字典的“键”和“值”都可能包含有用的信息。它们都可以用来做文章。要定义一个字典,通常有两种方式。
第一种是直接定义:
通过d = {key1: 值1, key2: 值2, ...}
比如:phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
字典的基本元素称为键值对(key-value对),也可以称为“项”(item)。每个项(键值对)使用冒号(:)分割键和值,每项之间使用逗号(,)分割,整个字典包括在花括号({})中。其中的键(key)和值(value)一一映射,一一对应。
第二种是通过dict()函数来定义:
函数dict()能够接收具备映射性质的实参来创建字典
a.接收关键字实参
比如:d = dict(name='David', age=25)
>>> d = {'name': 'David', 'age': 25}
b.接收类似[(a1, b1), (a2, b2), ...]的实参
例:d = dict([('name', 'David'), ('age', 25)])将创建与上个例子相同的字典
>>> d = {'name': 'David', 'age': 25}
像函数list、tuple和str一样,如果调用dict()函数时没有提供任何实参,将返回一个空字典。即dict()={}。
需要注意的是,虽然字典基本能够容纳任何类型的数据,但只是针对它的“值”而言的。字典的“键”必须是不可变类型的数据,比如:字符串,元组,数,而不能是:列表,字典或其他可变类型的数据。
还有一点,因为字典是通过“键”访问其中的“值”,所以键必须是唯一的。否则,计算机会觉得混乱,不知道我们想要哪个值。并且字典中的项是无序的,因为已经有“键”了,我们无需再通过顺序来标识其中的项。不必像列表、元组和字符串一样使用索引为它们所包含的元素排序。
字典的很多基本操作类似于其他序列,大致包含如下:
1)len(d)返回字典d包含的项(键-值对)数
2)d[k]返回与键k相关联的值
3)d[k] = v将值v关联到键k
4)del d[k]删除键为k的项
5)k in d检查字典d是否包含键为k的项
方法2)中是根据字典中已经存在的键获取其关联的值;方法3)是将新值v赋值给字典中不存在的键或者是已经存在的键,如果键存在新值v覆盖原有的值,如果键不存在就创建一个新的键-值对。
Python字典内置有很多方法,可以使用它们来操作字典,获得我们想要的结果。
1)clear
作用:删除字典中的所有项
返回值:该方法没有返回值,或者说返回None
用法:d.clear()
例:
>>> d = {'name': 'David', 'age': 25}
>>> return_value = d.clear()
>>> d
{}
>>> return_value
None
2)get
作用:get方法也能够根据键获得值,但比d[key]的方式取值更好用,后一种方法只适用于键存在时(否则会抛出异常),而get方法不会如此(键不存在时返回None)
用法:value = d.get(key)
例:
>>> d = {'name': 'David', 'age': 25}
>>> d.get('name')
'David'
>>> d.get('phone')
None
#【也可以设置键不存在时的返回值(如果不设置,即默认为None)】
>>> d.get('phone',119)
119
PS:在编写取字典值的代码时,使用此方法,我们将会体验到它的好用。
3)items
作用:返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式。
返回值:items方法返回的是一个“字典视图”,dict_items(), 里面包含的即是返
回一个包含所有字典项的列表。
用法:t = d.items()
例:
>>> d = {'name': 'David', 'age': 25}
>>> t = d.items()
>>> t
dict_items([('name', 'David'), ('age', 25)])
PS:dict_items()是一种名为字典视图的特殊类型,可用于迭代,可用于成员资格
检查,可使用len(t)。但是不能当做正常的字典来用,比如:不能t['name'],不能
t[0]。并且它始终是底层字典的反映,t会跟随字典d的变化而变化。
4)keys
作用:返回一个包含所有字典key的列表,也属于“字典视图”,为dict_keys()。
例:
>>> d = {'name': 'David', 'age': 25}
>>> t = d.keys()
>>> t
dict_keys(['name', 'age'])
PS:其他跟items方法类似。
5)values
作用:返回一个包含所有字典value的列表,也属于“字典视图”,为dict_values()。
例:
>>> d = {'name': 'David', 'age': 25}
>>> t = d.values()
>>> t
dict_values(['David', 25])
PS:其他跟items方法类似。
6)pop
作用:用于获取与指定键相关联的值,并将该键-值对从字典中删除。需要注意的是,当指定的键不存在时,会抛异常。
用法:value = d.pop(key)
例:
>>> d = {'name': 'David', 'age': 25}
>>> val = d.pop('age')
>>> val
25
>>> d
{'name': 'David'}
7)popitem
作用:类似于list.pop,但list.pop弹出列表中的最后一个元素,而popitem弹出出一个字典项。但由于字典是无序的。最好使用OrderedDict来使用此方法。
返回值:弹出的字典项的元组形式。
用法:tur = d.popitem()
例:
>>> d = {'name': 'David', 'age': 25}
>>> d.popitem()
('age', 25)
>>> d
{'name': 'David'}
PS:OrderedDict是属于“有序字典”类型,
形式为OrderedDict([('name', 'David'), ('age', 25)]),基本可以像操
作普通字典一样操作它,但它其中的元素是有序的。
8)setdefault
作用:方法setdefault有点像get,因为它也获取与指定键相关联的值,但除此之外,setdefault 还在字典不包含指定的键时,在字典中添加指定的键-值对。
用法:value = d.setdefault(key)
例:
>>> d = {'name': 'David', 'age': 25}
>>> val = d.setdefault('phone', 119)
>>> val
119
>>> d
{'name': 'David', 'age': 25, 'phone': 119}
>>> d = {'name': 'David', 'age': 25}
>>> val = d.setdefault('age', 18)
>>> val
25
>>> d
{'name': 'David', 'age': 25}
9)update
作用:使用一个字典中的项来更新另一个字典。原字典中已经存在该项时,就替换;不存在就创建。
用法:d.update(d1)
例:
>>> d = {'name': 'David', 'age': 25}
>>> d.update({'phone': 119})
>>> d
{'name': 'David', 'age': 25, 'phone': 119}
>>> d.update({'name': 'Alice'})
>>> d
{'name': 'Alice', 'age': 25, 'phone': 119}
>>> d.update(age=18)
>>> d
{'name': 'Alice', 'age': 18, 'phone': 119}
Python字典的方法不止这些,上述所列只是比较常用的。
关于字典无序的补充说明:
Python字典中的项无序在python2.x版本中能够容易的体现到。在python3.x中,Python字典会按照其中项的创建顺序为它们排位,即它们有初始顺序。但我们无法对这初始排序做些什么。下面的实例能够体现Python字典的无序性:
>>> d1 = {'name': 'David', 'age': 25}
>>> d2 = {'age': 25, 'name': 'David'}
>>> d1 == d2
True
而对于OrderedDict有序字典,上述测验的结果为“False”
>>> from collections import OrderedDict
>>> d1 = OrderedDict([('name', 'David'), ('age', 25)])
>>> d1
OrderedDict([('name', 'David'), ('age', 25)])
>>> d2 = OrderedDict([('age', 25), ('name', 'David')])
>>> d1 == d2
False
参考书籍:
《Python基础教程(第三版)》 ---作者:Magnus Lie Hetland 著,袁国忠 译
链接:百度云盘
提取码:7r7o