>>> 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. 检查字典中是否存在键或值¶
in
和 not 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对象,但键不行。
不允许同一个键出现两次。
>>> dict = {'Name': 'osgeo', 'Age': 7, 'Name': '地理信息'}
>>> print ("dict['Name']: ", dict['Name']) #创建时如果同一个键被赋值两次,后一个值会被记住,
dict['Name']: 地理信息
键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行。
>>> 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