>>> from env_helper import info; info()

5.1. 字典和结构化数据

从字面上看,字典就像我们生活中的字典。它具有如下特征:

  • 字典和列表一样,也能够存储多个数据。

  • 列表中找某个元素时,是根据下标进行的。

  • 字典中找某个元素时,是根据’名字’(就是冒号:前面的那个值,例如上面代码中的’name’、’id’、’sex’)

  • 字典的每个元素由2部分组成,键:值。例如 ‘name’:’班长’ ,’name’为键,’班长’为值

Python字典是一种可变容器模型,且可存储任意类型对象,它使用键-值(key-value)存储,具有极快的查找速度。

请注意,字典的每个键值(key=>value)对用冒号( : )分割,每个对之间用逗号( , )分割,整个字典包括在花括号( {} )中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

5.1.1. 字典的用途

字典的名称指出了这种数据结构的用途。 普通图书适合按从头到尾的顺序阅读,如果你愿意,可快速翻到任何一页,这有点像Python中的列表。 字典(Python字典)旨在让你能够轻松地找到特定的单词(键),以获悉其定义(值)。例如:

>>> phonebook={'Cecil':'3158','Osgeo':6298}
>>> phonebook['Osgeo']
6298
>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
>>> myCat['size']
'fat'
>>> myCat['size']
'fat'
>>> 'My cat has '+ myCat['color']+' fur.'
'My cat has gray fur.'

字典可以用整数值作为键,但它们不必从 0 开始,可以是任何数字。

>>> spam = {12345: 'Luggage Combination', 42: 'The Answer'}

字典中的表项是不排序的,它没有“第一个”表项,也不能像列表那样切片。在字典中,键-值对输入的顺序并不重要。

>>> spam = ['cats','dogs','moose']
>>> bacon = ['dogs','moose', 'cats']
>>> spam == bacon
False
>>> eggs = {'name': 'Zophie', 'species': 'cat', 'age':'8'}
>>> ham = {'species': 'cat', 'age': '8', 'name': 'Zophie'}
>>> eggs == ham
True

尝试访问字典中不存在的键,将导致 KeyError 出错信息。例如:

spam={'name': 'Zophie', 'age':7}
spam['color']

KeyError: 'color'

5.1.2. keys()values()items() 方法

有3个字典方法,它们将返回类似列表的值, 分别对应于字典的键、值和键-值对: keys()values()items() 。 这些方法返回的值不是真正的列表, 它们不能被修改,没有 append() 方法。 但这些数据类型可以用于for 循环。例如:

>>> spam = {'color': 'red', 'age': 42}
>>> for v in spam.values():
>>>     print(v)
red
42
>>> for k in spam.keys():
>>>     print(k)
color
age
>>> for i in spam.items():
>>>     print(i)
('color', 'red')
('age', 42)

注意 items()方法返回的 dict_items 值中,包含的是键和值的元组。如果希望得到一个真正的列表,就把类似列表的返回值传递给 list函数。

>>> spam = {'color': 'red', 'age': 42}
>>> spam.keys()
dict_keys(['color', 'age'])
>>> list(spam.keys())
['color', 'age']

也可以利用多重赋值的技巧,在for循环中将键和值赋给不同的变量。例如:

>>> spam = {'color': 'red', 'age': 42}
>>> for k, v in spam.items():
>>>     print('Key: ' + k +' Value: ' + str(v))
Key: color Value: red
Key: age Value: 42

5.1.3. 检查字典中是否存在键或值

innot in 操作符可以检查某个键或值是否存在于字典中。例如:

>>> spam = {'name': 'Zophie', 'age': 7}
>>> 'name' in spam.keys()
True
>>> 'Zophie' in spam.values()
True
>>>  'color' in spam.keys()
False
>>> 'color' in spam    #'color' in spam 本质上是一个简写版本。相当于  'color' in spam.keys() 。
False

5.1.4. get ()方法

get()方法可以检查该键是否存在于字典中,它有两个参数:要取得其值的键,以及如果该键不存在时,返回的备用值。

>>> picnicltems = {'apples':5, 'cups':2}
>>> 'I am bringing ' + str(picnicltems.get('cups', 0)) + ' cups.'
'I am bringing 2 cups.'
>>> 'I am bringing ' + str(picnicltems.get( 'eggs ', 0)) + ' eggs.'
'I am bringing 0 eggs.'

5.1.5. setdefault()方法

你常常需要为字典中某个键设置一个默认值,当该键没有任何值时使用它。例如:

>>> spam = {'name':'Pooka','age': 5}
>>> if 'color' not in spam:
>>>     spam['color'] = 'black'
>>> spam
{'name': 'Pooka', 'age': 5, 'color': 'black'}

如果键不存在于字典中,setdefault() 函数将会添加键并将值设为默认值。如果该键确实存在,方法就会返回键的值。

>>> spam = { 'name ': 'Pooka', 'age' : 5}
>>> spam.setdefault('color', 'black')
'black'
>>> spam
{'name ': 'Pooka', 'age': 5, 'color': 'black'}
>>> spam.setdefault('color','white')
'black'
>>> spam
{'name ': 'Pooka', 'age': 5, 'color': 'black'}

5.1.6. 修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对,例如:

>>> #!/usr/bin/python3
>>>
>>> dict = {'Name': 'osgeo', 'Age': 7, 'Class': 'First'}
>>>
>>> dict['Age'] = 8;               # 更新 Age
>>> dict['School'] = "python教程"  # 添加信息
>>>
>>>
>>> print ("dict['Age']: ", dict['Age'])
>>> print ("dict['School']: ", dict['School'])
dict['Age']:  8
dict['School']:  python教程

5.1.7. 删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。

显示删除一个字典用del命令,如下实例:

>>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
>>>
>>> del dict['Name'] # 删除键 'Name'
>>> dict.clear()     # 删除字典
>>> del dict         # 删除字典

执行 del 操作后字典不再存在,再次引用元素会引发一个异常:

>>> print ("dict['Age']: ", dict['Age'])
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-71-db4feadd2059> in <module>()
----> 1 print ("dict['Age']: ", dict['Age'])


TypeError: 'type' object is not subscriptable
>>> print ("dict['School']: ", dict['School'])
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-72-c732875ee348> in <module>()
----> 1 print ("dict['School']: ", dict['School'])


TypeError: 'type' object is not subscriptable

5.1.8. 字典键的特性

字典的值可以是任何的python对象,但键不行。

  1. 不允许同一个键出现两次。

>>> dict = {'Name': 'osgeo', 'Age': 7, 'Name': '地理信息'}
>>> print ("dict['Name']: ", dict['Name']) #创建时如果同一个键被赋值两次,后一个值会被记住,
dict['Name']:  地理信息
  1. 键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行。

>>> dict = {['Name']: 'Runoob', 'Age': 7}
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-74-f97ebe7c4998> in <module>()
----> 1 dict = {['Name']: 'Runoob', 'Age': 7}


TypeError: unhashable type: 'list'
>>> print ("dict['Name']: ", dict['Name'])
>>>
>>> TypeError: unhashable type: 'list'
  File "<ipython-input-75-e4f1ecb2de9b>", line 3
    TypeError: unhashable type: 'list'
                             ^
SyntaxError: invalid syntax

5.1.9. 字典内置函数&方法

Python字典包含了以下内置函数:

  • len(dict) 计算字典元素个数,即键的总数。

>>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
>>> len(dict)
3
  • str(dict) 输出字典,以可打印的字符串表示。

>>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
>>> str(dict)
"{'Name': 'Runoob', 'Age': 7, 'Class': 'First'}"
  • type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。

>>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
>>> type(dict)
dict