和列表相同,字典也是许多数据的集合,属于可变序列类型。不一样之处在于,它是无序的可变序列,其保存的内容是以“键值对”的形式存放的。
字典类型是 Python 中惟一的映射类型。“映射”是数学中的术语,简单理解,它指的是元素之间相互对应的关系,即经过一个元素,能够惟一找到另外一个元素。如图 1 所示。java
字典中,习惯将各元素对应的索引称为键(key,K值),各个键对应的元素称为值(value,V值),键及其关联的值称为“键值对”。
字典类型很像学生时代经常使用的新华字典。咱们知道,经过新华字典中的音节表,能够快速找到想要查找的汉字。其中,字典里的音节表就至关于字典类型中的键,而键对应的汉字则至关于值。
总的来讲,字典类型所具备的主要特征如表 1 所示。
python
表 1 Python 字典特征shell
主要特征 | 解释 |
---|---|
经过键而不是经过索引来读取元素 | 字典类型有时也称为关联数组或者散列表(hash)。它是经过键将一系列的值联系起来的,这样就能够经过键从字典中获取指定项,但不能经过索引来获取。 |
字典是任意数据类型的无序集合 | 和列表、元组不一样,一般会将索引值 0 对应的元素称为第一个元素。而字典中的元素是无序的。 |
字典是可变的,而且能够任意嵌套 | 字典能够在原处增加或者缩短(无需生成一个副本,在原数据上进行操做),而且它支持任意深度的嵌套,即字典存储的V值也能够是列表或其它的字典。 |
字典中的键必须惟一 | 字典中,不支持同一个键出现屡次,不然,只会保留最后一个键值对。 |
字典中的键必须不可变 | 字典中的K值是不可变的,只能使用数字、字符串或者元组,不能使用列表(K值必须是可哈希的)。 |
Python 中的字典类型至关于 Java 或者 C++ 中的 Map 对象。数组
和列表、元组同样,字典也有它本身的类型。Python 中,字典的数据类型为 dict,经过 type() 函数便可查看:函数
# a是一个字典类型 >>> a = {'one':1,'two':2,'three':3} >>> type(a) <class 'dict'>
建立字典的方式有不少,下面一一作介绍。spa
因为字典中每一个元素都包含 2 部分,分别是键和值,所以在建立字典时,键和值之间使用冒号分隔,相邻元素之间使用逗号分隔,全部元素放在大括号 {} 中。
Python 字典类型的语法格式以下:.net
dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}
其中 dictname 表示字典类型名,keyN: valueN 表示各个元素的键值对。须要注意的是,同一字典中各个元素的键值必须惟一。
以下代码示范了使用花括号语法建立字典:code
scores = {'语文': 89, '数学': 92, '英语': 93} print(scores) # 空的花括号表明空的dict empty_dict = {} print(empty_dict) # 使用元组做为dict的key dict2 = {(20, 30):'good', 30:[1,2,3]} print(dict2)
运行结果为:对象
{'语文': 89, '数学': 92, '英语': 93} {} {(20, 30): 'good', 30: [1, 2, 3]}
能够看到,同一字典中,K值能够是整数、字符串或者元组,只要符合惟一和不可变的特性;对应的V值能够是 Python 支持的任意数据类型。blog
Python 中,还可使用 dict 字典类型提供的 fromkeys() 方法建立全部键值为空的字典,使用此方法的语法格式为:
dictname = dict.fromkeys(list,value=None)
其中,list 参数表示字典中全部K值的列表,value 参数默认为 None,表示全部键对应的值。
例如:
# 列表knowledge = ['语文', '数学', '英语']效果相同 knowledge = {'语文', '数学', '英语'} scores = dict.fromkeys(knowledge) print(scores)
运行结果为:
{'语文': None, '数学': None, '英语': None}
能够看到,knowledge 列表中的元素所有做为了 scores 字典的键,而各个K值对应的V值都为空(None)。此种建立方式,一般用于初始化字典,设置 value 的默认值。
经过 dict() 函数建立字典的写法有多种,表 2 罗列出了经常使用的几种方式,它们建立的都是同一个字典 a。
表 2 dict() 函数建立字典
建立格式 | 注意事项 |
---|---|
a = dict(one = 1, two = 2, three = 3) | 注意,其中的 one、two、three 都是字符串,但使用此方式建立字典时,字符串不能带引号。 |
demo = [('two',2),('one',1),('three',3)] #方式1 demo = [['two',2],['one',1],['three',3]] #方式2 demo = (('two',2),('one',1),('three',3)) #方式3 demo = (['two',2],['one',1],['three',3]) #方式4 a = dict(demo) |
向 dict() 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素做为键,第二个元素做为值。 |
demokeys = ['one','two','three'] #还能够是字符串或元组 demovalues = [1,2,3] #还能够是字符串或元组 a = dict(zip(demokeys,demovalues)) |
经过应用 dict() 函数和 zip() 函数,可将前两个列表转换为对应的字典。 |
注意,不管采用以上哪一种方式建立字典,字典中各元素的键都只能是字符串、元组或数字,不能是列表。
若是不为 dict() 函数传入任何参数,则表明建立一个空的字典。例如以下代码:
# 建立空的字典 dict5 = dict() print(dict5)
运行结果为:
{}
列表、元组访问元素都是经过下标,字典是经过键(K值)来访问对应的元素值(V值)。
由于字典中元素是无序的,因此不能像列表、元组那样,采用切片的方式一次性访问多个元素。
例如,若是想访问刚刚创建的字典 a 中,获取元素 1,可使用下面的代码:
>>> a['one'] 1
在使用此方法获取指定键的值时,若是键不存在,则会抛出以下异常:
>>> a['four'] Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> a['four'] KeyError: 'four'
另外,除了上面这种方式外,Python 更推荐使用 dict 类型提供的 get() 方法获取指定键的值。get() 方法的语法格式为:
dict.get(key[,default])
其中,dict 指的是所建立的字典名称;key 表示指定的键;default 用于指定要查询的键不存在时,此方法返回的默认值,若是不手动指定,会返回 None。
例如,经过 get() 方法获取字典 a 中“two”对应的值,执行代码以下:
>>> a = dict(one=1,two=2,three=3) >>>a.get('two') 2
固然,为了防止在获取指定键的值时,因不存在该键而致使抛出异常,在使用 get() 方法时,能够为其设置默认值,这样,即使指定的键不存在,也不回报错。例如:
>>> a = dict(one=1,two=2,three=3) >>> a.get('four','字典中无此键') '字典中无此键'
和删除列表、元组同样,手动删除字典也可使用 del 语句。例如:
>>> a = dict(one=1,two=2,three=3) >>> a {'one': 1, 'two': 2, 'three': 3} >>> del(a) >>> a Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> a NameError: name 'a' is not defined