课时26:字典:各种内置方法
目录:
一、fromkeys()
二、keys()、values()、items()
三、get()
四、copy()
五、pop()和popitem()
六、update()
七、课时26课后习题及答案
字典是Python中唯一的映射类型,字典不是序列。如果在序列中试图为一个不存在的位置赋值时,会报错;但是如果在字典中,会自动创建相应的键并添加对应的值进去。
*******************
一、fromkeys()
*******************
fromkeys()方法用于创建并返回一个新的字典,它有两个参数:第一个参数是字典的键;第二个参数是可选的,是传入键对应的值。如果不能提供,那么默认是None。举个例子:
>>> dict = {} >>> dict.fromkeys((1,2,3)) {1: None, 2: None, 3: None} >>> dict1 = {} >>> dict1.fromkeys((1,2,3)) {1: None, 2: None, 3: None} >>> dict2 = {} >>> dict2.fromkeys((1,2,3),"Number") {1: 'Number', 2: 'Number', 3: 'Number'} >>> dict3 = {} >>> dict3.fromkeys((1,2,3),("one","two","three")) {1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
最后一个例子,告诉我们,不能想天然,fromkeys()方法并不会把'one', 'two', 'three'分别赋值给1、2和3,因为fromkeys()把('one', 'two', 'three')当成一个值了。
*******************************************
二、keys()、values()、items()
*******************************************
访问字典的方法有:keys()、values()、items()
keys()用于返回字典中的键,values()用于返回字典中的所有值,那么items()当然就是返回字典中的所有的键值对(也就是项)啦。举个例子:
>>> dict1 = {} >>> dict1 = dict1.fromkeys(range(12),"赞") >>> dict1.keys() dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> dict1.values() dict_values(['赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞']) >>> dict1.items() dict_items([(0, '赞'), (1, '赞'), (2, '赞'), (3, '赞'), (4, '赞'), (5, '赞'), (6, '赞'), (7, '赞'), (8, '赞'), (9, '赞'), (10, '赞'), (11, '赞')])
字典可以很大,有些时候我们并不知道提供的项是否在字典中存在,如果不存在,Python就会报错:
>>> print(dict1[32]) Traceback (most recent call last): File "<pyshell#20>", line 1, in <module> print(dict1[32]) KeyError: 32
*************
三、get()
*************
get()方法提供了更宽松的方式去访问字典项,当键不存在的时候,get()方法并不会报错,只是默默地返回了一个None,表示啥也没找到:
>>> dict1.get(11) '赞' >>> dict1.get(12) >>>
如果希望找不到数据时返回指定的值,那么可以在第二个参数设置对应的默认返回值:
>>> dict1.get(12,"木有") '木有'
>>> dict1.get(11,"木有")
'赞'
如果不知道一个键是否在字典中,那么可以使用成员资格操作符(in或not in)来判断:
>>> 11 in dict1 True >>> 12 in dict1 False
在字典中检查键的成员资格比序列更高效,当数据规模相当大的时候,两者的差距会很明显(注:因为字典是采用哈希的方法一对一找到成员,而序列则是采用迭代的方式逐个比对)。最后需要注意的一点是,这里查找的是键而不是值,但是在序列中查找的是元素的值而不是元素的索引。
如果需要清空一个字典,则使用clear()方法:
>>> dict1 {0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞', 5: '赞', 6: '赞', 7: '赞', 8: '赞', 9: '赞', 10: '赞', 11: '赞'} >>> dict1.clear() >>> dict1 {}
也许你会使用变量名赋值为一个空字典的方法来清空字典,这样做存在一定的弊端。举个例子跟大家说说这两种清楚方法有什么不同:
>>> a = {"姓名":"小甲鱼"} >>> b = a >>> b {'姓名': '小甲鱼'} >>> a = {} >>> a {} >>> b {'姓名': '小甲鱼'}
从上面的例子中,a、b指向一个字典,然后试图通过将a重新指向一个空字典来达到清空的效果时,我们发现原来的字典并没有被真正的清空,只是a指向了一个新的空字典而已。所以这种做法在一定条件下会留下安全隐患(例如:账户的数据和密码等资料有可能会被窃取)。这里跟前面列表那 分片拷贝小节的内容 有同样的道理。
推荐的做法时使用clear()方法:
>>> a = {"姓名":"小甲鱼"} >>> b = a >>> b {'姓名': '小甲鱼'} >>> a.clear() >>> a {} >>> b {}
**************
四、copy()
**************
copy()方法时复制字典:
>>> a = {1:"one",2:"two",3:"three"} >>> b = a.copy() >>> id(a) 1939673555160 >>> id(b) 1939673621272 >>> a[1] = "four" >>> a {1: 'four', 2: 'two', 3: 'three'} >>> b {1: 'one', 2: 'two', 3: 'three'}
******************************
五、pop()和popitem()
******************************
pop()是给定键弹出对应的值,而popitem()是弹出一个项,这两个比较容易:
>>> a = {1:"one",2:"two",3:"three",4:"four"} >>> a.pop(2) 'two' >>> a {1: 'one', 3: 'three', 4: 'four'} >>> a.popitem() (4, 'four') >>> a {1: 'one', 3: 'three'} >>> a.popitem() (3, 'three') >>> a {1: 'one'}
setdefault()方法和get()方法有点相似,但是setdefaul()在字典中找不到对应的键时会自动添加:
>>> a = {1:"one",2:"two",3:"three",4:"four"} >>> a.setdefault(3) 'three' >>> a.setdefault(5) >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: None} >>>
*****************
六、update()
*****************
update()方法可以利用它来更新字典:
>>> pets = {"米奇":"老鼠","汤姆":"猫","小白":"猪"} >>> pets.update(小白="狗") >>> pets {'米奇': '老鼠', '汤姆': '猫', '小白': '狗'}
还记得在前面埋下的伏笔吗?在讲收集函数时我们说Python还有另外一种收集方式,就是用两个星号(**)表示。两个星号的收集参数表示为将参数们打包成字典的形式。
收集参数有两种打包形式:一种是以元组的形式打包,另一种则是以字典的形式打包:
>>> def test(**params): print("有%d两个参数"%len(params)) print("它们分别是:",params) >>> test(a=1,b=2,c=3,d=4,e=5) 有5两个参数 它们分别是: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
当参数带两个星号(**)时,传递给函数的任意个key=value实参会被打包进一个字典中,那么有打包就有解包,来看一个例子:
>>> a = {"one":1,"two":2,"three":3} >>> test(**a) 有3两个参数 它们分别是: {'one': 1, 'two': 2, 'three': 3} >>>
*******************************
七、课时26课后习题及答案
*******************************