打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python入门基础(章四 字典)
维也纳的雨落 2018-08-13 19:02:19

1. 概念与创建字典

映射类型是一种关联式的容器类型,它存储了对象与对象之间的映射关系。简而言之就是通过名称来访问其各个值得数据结构,这种数据结构称为映射。

字典的每个键值 key,value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中,字典由键-值对称为项(item) ,格式如下所示:

>>> d = {key1 : value1, key2 : value2 }

>>> dir = {'Jack' : 'US', 'Ammy' : 'China'}

字典是Python内置映射类型,其值不按顺序排列,而是储存在键值下。键可以是数、字符串或元组。

对于字典来讲索引是行不通的

对字典进行索引

字典中键只有在值和类型完全相同的时候才视为一个键:

>>> dir = { 1 : 1 ,'1' :1} #dir[1]和dir['1']是不同的


2.函数dict

可以用函数dict从其他映射(如其他字典)或键-值对序列创建字典。

还可以用关键字实参来调用这函数

---

3. 基本的字典操作

1. len(d):返回字典d包含的项(键-值对)数。

2. d(k):返回与键k相关联的值。

3. d(k) = v:值v关联到键k。

4. del [k]:删除键k的项。

5. k in d:检查字典d是否包含键k的项。

键的类型:字典中的键可以是整数也可以是非整数。字典中的键可以是任何不可变的值,如浮点数、字符串或元组。

自动添加:即使字典中原来没有键,也可以给它赋值,这将在字典中创建一个新项。然而,如果不适用append或其它方法,就不能给列表中原有的元素赋值。

成员资格:表达式k in d(d是一个字典)查找的是键而不是值,而表达式v in l(l 是一个列表)查找的是值而不是索引。

---

键可以是任何不可变的类型

在尝试给空列表索引42的元素,但因为为没有这种元素显然是不可能的。

字典中这么做一点问题也没有,相当于在字典中添加了一个新项。

4. 字典方法

①clear

删除所有的字典项,因此什么都不返回也可以说返回None


clear基本用途

首先字典里包括了name以及名字jack,当我把x值赋值给y时,显然y和x是一样的。如果把x赋值为空,打印出来的x就为空字典,但字典y还有内容。显然如果这不是你想要的结果的话,用clear试试

---

用clear函数

赋值

首先字典里包括了name以及名字jack,当我把x值赋值给y时,显然y和x是一样的。如果把x赋值为空,打印出来的x就为空字典,但字典y还有内容。显然如果这不是你想要的结果的话,用clear试试

clear清除

打印出来的字典x和y都为空


②copy

返回一个新字典,其包含的键-值对与原来的字典相同(这种为浅复制,因为值本身是原件,而非副本)

当替换副本中的值,原件不受影响。但是如果修改副本的值(修改不是替换),原件也发生变化,因为原件指向的也是被修改的值。

---

为了避免上述的问题,可执行深层拷贝,用到copy模块中的函数deepcopy

1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。(比深拷贝更加节省内存)

2. copy.deepcopy 深拷贝 拷贝对象及其子对象

用一个简单的例子说明如下:

>>>import copy

>>>a = [1, 2, 3, 4, ['a', 'b', 'c']]

>>> b = a

>>> c = copy.copy(a)

>>> d = copy.deepcopy(a)

很容易理解:a是一个列表,表内元素a[4]也是一个列表(也就是一个内部子对象);b是对a列表的又一个引用,所以a、b是完全相同的,可以通过id(a)==id(b)证明。

第4行是浅拷贝,第五行是深拷贝,通过id(c)和id(d)可以发现他们不相同,且与id(a)都不相同:

>>> id(a)

19276104

>>> id(b)

19276104

>>> id(c)

19113304

>>> id(d)

19286976


至于如何看深/浅拷贝的区别,可以通过下面的操作来展现:

>>> a.append(5) #操作1

>>> a[4].append('hello') #操作2


这时再查看结果:

>>> a

[1, 2, 0, 4, ['a', 'b', 'c', 'hello'], 5]

>>> b

[1, 2, 0, 4, ['a', 'b', 'c', 'hello'], 5]

>>> c

[1, 2, 3, 4, ['a', 'b', 'c', 'hello']]

>>> d

[1, 2, 3, 4, ['a', 'b', 'c']]

可以发现a、b受了操作1、2的影响,c只受操作2影响,d不受影响。a、b结果相同很好理解。由于c是a的浅拷贝,只拷贝了父对象,因此a的子对象( ['a', 'b', 'c', 'hello'])改变时会影响到c;d是深拷贝,完全不受a的影响。


③get

如果试图访问字典中没有的元素,将引发错误。


如果使用get将不会发生错误


用get元素没有引发异常,而是返回None。而且可以指定值而不是None


④items

返回一个包含所有字典项的列表,其中每个元素都为(key,value)的形式,字典项目在列表中排列顺序不确定。


还可以对长度进行检查

>>> it= d.items()

>>> len(it)

> 3


⑤pop

获取与指定键相关的值,并将该键-值对从字典中删除

>>> d = {'x':1,'y':2}

>>> d.pop(x)

> 1

>>> d

> {'y':2}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
两分钟掌握在python的深拷贝与浅拷贝
Python爬虫基础面试题为2019年初大学生就业做准备(文末附教程)
给妹子讲python-S01E11赋值与对象拷贝
一步学会Python高级编程
第118天:Python 之对象的比较与拷贝
面试题-python 浅拷贝和深拷贝(copy模块)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服