课时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课后习题及答案

*******************************

posted @ 2018-08-16 15:07  那是个好男孩  阅读(648)  评论(0编辑  收藏  举报