字典的使用
通过键名可以快速查找到键值。
在python中对字典进行了构造,让我们可以轻松查到某个特定的键,从而通过键找到对应的值。
假如要创建一个可以存储学生姓名和学号的小型数据库,应该怎么做?我们用以前学习过的列表实现。
example:
>>> names=['小王','小李','小张']
>>> numbers=['001','002','003']
>>> print('小李的学号是:',numbers[names.index('小李')]) #通过 name.index('小李')获取小李的索引值同步对应numbers中去
小李的学号是: 002
上述例子如果是用字典表述,更加简单了。如下所示:
example:
>>> names_numbers={'小王':'001','小李':'002','小张':'003'}
>>> print('小李的学号是:',names_numbers['小李'])
小李的学号是: 002
创建和使用字典
字典的格式如下:
>>> d={key1:value1,key2:value2}
字典由多个键及其对应的键值构成的对组成。(把键/值对称为项) 字典的每个键值对用冒号分割,每个项之间用逗号分割,整个字典包括在花括号{}中。空字典不包括任何项,由两个大括号组成,如{}。
字典示例:
>>> dict1 = { "123":"ABC"}
>>> dict1
{'123': 'ABC'}
>>> dict2={0:'a',1:'b',2:'c'}
>>> dict2
{0: 'a', 1: 'b', 2: 'c'}
dict函数
可以用dict函数通过其他映射(如其他字典)或键值序列对建立字典。
>>> student=[('name','小萌'),('number','1001')]
>>> student
[('name', '小萌'), ('number', '1001')]
>>> print(dict(student))
{'name': '小萌', 'number': '1001'}
>>> dict(name="小仓",number="005")
{'name': '小仓', 'number': '005'}
字典的基本操作
(1)修改字典
向字典添加新内容的方法是增加新键值对,修改或删除已有键值对。
>>> student
{'小萌': '1001', '小智': '1002', '小强': '1005'}
>>> student['小强']='1003' #通过键名修改键值
>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003'}
>>> student['小张']='1004' #新增键值对
>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003', '小张': '1004'}
>>> print('小张的学号:%(小张)s'% student) #格式化字符串
小张的学号:1004
(2)删除字典元素
del 字典名称 删除整个字典
del 字典名称(键名) 删除字典中键名相关的键值对
>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003', '小张': '1004'}
>>> del student['小张']
>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003'}
(3)字典键的特性
字典值可以没有限制的取任何python对象,既可以是标准对象,也可以是用户定义的对象,但键不行。需要记住以下两点:
不允许同一个键出现两次。创建时如果同一个键名先后被赋值两次,后面的值会被记住。
键名必须不可变,可以用数字/字符串或元组充当,不能用列表。
(4)len函数
len(dict) 用于计算字典元素的个数,即键的总数。
>>> student
{'小萌': '1001', '小智': '1002', '小强': '1003'}
>>> len(student)
3
(5)type函数
tpye(variable)函数返回输入的变量类型
判断变量variable的数据类型
>>> type(student)
<class 'dict'>
字典的格式化字符串
example:
>>> student
[('name', '小萌'), ('number', '1001')]
>>> ab=dict(student)
>>> ab
{'name': '小萌', 'number': '1001'}
>>> print('小萌的学号是:%(number)s' % ab) #区别于字符串的格式化,字典的格式化中多了键名, %(键名)s
小萌的学号是:1001
>>> student={'小萌':'1001','小智':'1002','小强':'1005'}
>>> print('小强的学号是:%(小强)s' % student)
小强的学号是:1005
由操作结果可以看出,字典的格式化方式是在每个转换说明符的%字符后加上用圆括号括起来的键名,再跟上其他说明元素。
字典的格式化除了增加字符串键外,转换说明符还像以前一样工作。以这种方式使用字典时,只要所给出的键名在字典中可以找到,就可以获得任意数量的转换说明符。
字典和列表的区别
dict特点:
(1)查找和插入的速度极快,不会随着key的增加而变慢;
(2) 需要占用大量内存,内存浪费多。
list特点:
(1)查找和插入时间随着元素的增加而增加;
(2)占用空间小,浪费内存很少。
所以,dict是使用空间换取时间。
dict可以用在很多需要高速查找的地方,dict的键名必须是不可变对象。
dict内部存放的顺序和键放入的顺序没有关系。
字典方法
clear()方法
dict.clear()
此语法中,dict代表指定字典,该方法不需要参数。韩函数是一个原地操作函数(类似于list.sort()),没有任何返回值(返回值为none)。
>>> student={'小梦':'001','小智':'002','小强':'003','小张':'004'}
>>> student
{'小梦': '001', '小智': '002', '小强': '003', '小张': '004'}
>>> print("原始字典的元素个数为:%d" % len(student))
原始字典的元素个数为:4
>>> student.clear()
>>> print("clear后的字典元素个数为: %d" % len(student))
clear后的字典元素个数为: 0
copy()方法
dict.copy()
该语法中dict代表指定字典,不需要参数,返回一个具有相同键值对的新字典。之歌方法是浅复制,因为值本身是相同的,而不是副本。
>>> st={'小梦': '001', 'info':[ 'man', '小强', '003'], '小张': '004'}
>>> st
{'小梦': '001', 'info': ['man', '小强', '003'], '小张': '004'}
>>> st1=st.copy()
>>> st1['小张']='005' #更改某个值,原始字典保持自己不变
>>> print("更改后的字典为:" ,st1)
更改后的字典为: {'小梦': '001', 'info': ['man', '小强', '003'], '小张': '005'}
>>> print("原始字典sudent为:",st)
原始字典sudent为: {'小梦': '001', 'info': ['man', '小强', '003'], '小张': '004'}
>>> st1['info'].remove('man') #改变某个值,原始字典跟随修改后的字典同样改变
>>> print("删除后st1为:",st1)
删除后st1为: {'小梦': '001', 'info': ['小强', '003'], '小张': '005'}
>>> print("删除后st为:",st)
删除后st为: {'小梦': '001', 'info': ['小强', '003'], '小张': '004'}
替换副本的值时原始字典不受影响。如果修改了某个值(原地修改不是替换),原始字典就会改变,因为同样的值也在原始字典中。以这种方式进行复制就是浅复制,而使用深复制(deep copy)就可以避免这种问题。
fromkeys()方法
dict.fromkeys(seq [,value])
此方法用于创建一个新的字典。
此语法中,dict表示指定字典,seq代表字典健名列表:value代表可选参数(键名对应的键值),设置键序列(seq)的值,该方法返回结果为列表。
>>> seq=('name','age','sex')
>>> info=dict.fromkeys(seq)
>>> print("新的字典为: %s" % info)
新的字典为: {'name': None, 'age': None, 'sex': None}
>>> info=dict.fromkeys(seq,10)
>>> print("新的字典为: %s" %info)
新的字典为: {'name': 10, 'age': 10, 'sex': 10}
get()方法
get()方法返回指定键的值,如果值不在字典中,就返回默认值。
语法如下:
dict.get(key,default=None)
dict代表指定字典,可以
代表字典中要查找的键名,default代表指定健名的键值不存在时返回的默认值。
>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004'}
>>> print("小梦的学号为:%s" % st.get())
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
print("小梦的学号为:%s" % st.get())
TypeError: get expected at least 1 arguments, got 0
>>> print("小梦的学号为:%s" % st.get('小梦'))
小梦的学号为:001
>>> print("小锌的学号为:%s" % st.get('小锌'))
小锌的学号为:None
print("小锌的学号为:%s" % st.get('小锌',default='小锌对应的学号不存在,没有小锌这位同学')) #get里面参数两个,健名和默认值,默认值直接跟逗号后面,不应该写default="",这样书写是错误的
TypeError: get() takes no keyword arguments
>>> print("小锌的学号为:%s" % st.get('小锌','小锌对应的学号不存在,没有小锌这位同学')) #默认值的正确写法
小锌的学号为:小锌对应的学号不存在,没有小锌这位同学
>>>
key in dict()方法
小梦是否在字典st中?True
>>> print("小强是否在字典st中? %s" % ('小梦' in st))
小强是否在字典st中? True
>>> print("小强是否在字典st中?" % ('小强' in st))
Traceback (most recent call last):
File "<pyshell#58>", line 1, in <module>
print("小强是否在字典st中?" % ('小强' in st))
TypeError: not all arguments converted during string formatting
>>> print("小强是否在字典st中?%s" % ('小强' in st))
小强是否在字典st中?False
items()方法
以列表形式返回可遍历的(键/值)元组数组。
dict.items()
>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004'}
>>> st.items()
dict_items([('小梦', '001'), ('info', ['小强', '003']), ('小张', '004')])
keys()方法
返回一个字典的所有键名
dict.keys()
>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004'}
>>> st.keys()
dict_keys(['小梦', 'info', '小张'])
setdefault()方法
和get()方法类似,用于获得给定键相关联的值,default代表键不存在时设置的默认键值。该方法没有任何返回值。
dict.setdefault(key,default=None)
>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004', 1: 'a', 2: 'b'}
>>> st.setdefault(1)
'a'
>>> st.setdefault(1,'zhangsna')
'a'
>>> st.setdefault("info")
['小强', '003']
>>> st.setdefault("zhangsna","zhagnsna")
'zhagnsna'
>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004', 1: 'a', 2: 'b', 'zhangsna': 'zhagnsna'}
//setdefault()方法如果键不存在则返回默认值,而原始的字典则会添加上该键和其默认值的值,改变了原始的字典。而get()方法则不改变原始的字典
update()方法
把dict2中的键值对更新到dict中。
dict.update(dict2)
该方法无返回值。
>>> new={1:'a',2:'b'}
>>> new
{1: 'a', 2: 'b'}
>>> st.update(new)
>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004', 1: 'a', 2: 'b'}
>>>
提供的字典中的项被添加到新的字典中,如果有相同的健名的项即可被覆盖。
values()方法
返回字典中所有的键值
用法:dict.values()
>>> st
{'小梦': '001', 'info': ['小强', '003'], '小张': '004'}
>>> st.keys()
dict_keys(['小梦', 'info', '小张'])
>>> st.values()
dict_values(['001', ['小强', '003'], '004'])