python学习笔记(五)之字典2

编程实战中经常用到

实例1:copy

>> ad = {"name":"wtf","hig":"180"}

>> bd = ad

>> bd

{'name': 'wtf', 'hig': '180'}

>> id (ad)

4539954352

>> id (bd)

4539954352

说明:一个对象贴上两个标签,使用赋值,实现了所谓的“假装拷贝”。

如果使用copy()

>> cd = ad.copy()

>> cd

{'name': 'wtf', 'hig': '180'}

>> id (cd)

4541831160

说明:这次得到的cd于原来的ad是不同的。

如果我修改cd,就应该对原来的ad不会造成什么影响,如下:

>> cd["name"] = "didi"

>> cd

{'name': 'didi', 'hig': '180'}

>> ad

{'name': 'wtf', 'hig': '180'}

如果我修改了bd,则ad也应该跟着改变的,如下:

>> bd["name"] = "aaa"

>> bd

{'name': 'aaa', 'hig': '180'}

>> ad

{'name': 'aaa', 'hig': '180'}

关于python中的浅拷贝与深拷贝

浅拷贝

实例2:元组中含有列表

>> x = {"name":"wtf","lang":["python","java"]}

>> type(x)

>> y = x.copy()

>> y

{'lang': ['python', 'java'], 'name': 'wtf'}

>> id(x)

4529826624

>> id(y)

4529826344

说明:y是从x拷贝过来的,两个在内存中是不同的对象。

现在键“lang”的值是一个列表,为['python', 'java'],这里用remove()这个列表方法删除其中的一个元素“java”。删除之后,这个列表就变为:['python'],操作如下:

>> y["lang"].remove("java")

>> y

{'lang': ['python'], 'name': 'wtf'}

按照实例1,它是另一个对象,x应该是不会改变的,则:

>> x

{'lang': ['python'], 'name': 'wtf'}

x竟然改变啦!!

下面我们使用id()来分析下:

>> id(x)

4529826624

>> id(y)

4529826344

说明:x,y确实对应着两个不同的对象,但是这个对象(字典)是由两个键值组成的,其中一个键的值是列表。

>> id(x["lang"])

4529661856

>> id(y["lang"])

4529661856

说明:列表竟然是同一个对象!!

原因解释:

python在所执行的复制动作中,如果是基本类型的对象(专值数字和字符串),就在内存中重新建个窝;如果不是基本类型的,就不建新窝,而是用标签引用原来的窝。

深拷贝

python中的深拷贝就是使用import来导入一个模块。

实例3:

>> import copy

>> z = copy.deepcopy(x)

>> z

{'lang': ['python'], 'name': 'wtf'}

>> id(x["lang"])

4529661856

>> id(z["lang"])

4529828136

说明:果然是新建了一个窝,而不是引用啦!

此时,如果修改其中一个,应该不影响另一个。

实例4:

>> x

{'lang': ['python'], 'name': 'wtf'}

>> x["lang"].remove("python")

>> x

{'lang': [], 'name': 'wtf'}

>> z

{'lang': ['python'], 'name': 'wtf'}

clear

说明:在交互模式下,用help()是一个很好的习惯。

clear是一个清空字典中所有元素的操作

实例5:

>> x

{'lang': [], 'name': 'wtf'}

>> x.clear()

>> x

{}

说明:将字典清空,得到一个“空”字典。

del()是将字典删除,内存中就没有它了,不是为“空”。

实例6:

>> y

{'lang': [], 'name': 'wtf'}

>> del(y)

>> y

Traceback (most recent call last):

File "", line 1, in

NameError: name 'y' is not defined

get,setdefault

get的含义是:

help(dict.get)

get(...)

D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.

说明:“if k in D”,就返回其值

实例7:

>> d

{'lang': 'python'}

>> d.get("lang")

'python'

说明:dict.get()就是要得到字典中某个键的值,其实,

>> d["lang"]

'python'

也可以得到。

但是,如果是不存在的值,则:

实例8:

>> print d.get("name")

None

>> d["name"]

Traceback (most recent call last):

File "", line 1, in

KeyError: 'name'

说明:这就是dict.get()与dict["key]的区别。

前面有一个半句话,如果键不在字典中,会返回none,这是一种情况。还可以这样:

实例9:

>> d

{'lang': 'python'}

>> newd = d.get("name","didi")

>> newd

'didi'

>> d

{'lang': 'python'}

说明:以d.get("name","didi")的方式,如果不能得到键"name"的值,就返回后面指定的值"didi"。这就是文档中D.get(k[,d]) -> D[k] if k in D, else d.的含义。这样做,并没有影响原来的字典。

setdefault

help(dict.setdefault)

含义:D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D

说明:与get的功能上有相似的地方。

实例10:

>> d

{'lang': 'python'}

>> d.setdefault("lang")

'python'

>> d.setdefault("name","didi")

'didi'

>> d

{'lang': 'python', 'name': 'didi'}

说明:没有"name"这个键,于是就返回d.setdefault("name","didi")指定的值"didi",并且将键值对"name":"didi"添加到原来的字典中。

如果是这样的:

实例11:

>> d.setdefault("web")

>> print d

{'lang': 'python', 'web': None, 'name': 'didi'}

说明:键"web"的值变成了“None”

items/iteritems,keys/iterkeys,values/itervalues

说明:在pytho3中不再需要:iteritems,iterkeys,itervalues

~ python --version

Python 2.7.10

>> help(dict.items)

items(...)

D.items() -> list of D's (key, value) pairs, as 2-tuples

实例12:

>> dd = {"name":"wtf","lang":"java","web":"www.datagrand.com"}

>> dd_kv = dd.items()

>> dd_kv

[('lang', 'java'), ('web', 'www.datagrand.com'), ('name', 'wtf')]

说明:这种操作对循环有大用。

>> help(dict.iteritems)

iteritems(...)

D.iteritems() -> an iterator over the (key, value) items of D

实例13:

>> dd

{'lang': 'java', 'web': 'www.datagrand.com', 'name': 'wtf'}

>> dd_iter = dd.iteritems()

>> type(dd_iter)

>> dd_iter

>> list(dd_iter)

[('lang', 'java'), ('web', 'www.datagrand.com'), ('name', 'wtf')]

说明:得到的dd_iter的类型,是一个“dictionary-itemiterator”类型,不过这种迭代器类型的数据不能直接输出,必须用list()转换一下,才能看到里面的真面目。

另外两组与item/iteritems含义相似。

pop,popitem

说明:在列表中,有关删除列表中元素的函数pop和remove,这两个的区别在于:list.remove(x)用来删除指定的元素,而list.pop[i]用来删除指定索引的元素,如果不提供索引值,就默认删除最后一个。

在字典中,也有删除键值对的函数

>> help(dict.pop)

pop(...)

D.pop(k[,d]) -> v, remove specified key and return the corresponding value.

If key is not found, d is returned if given, otherwise KeyError is raised

其中,D.pop(k[,d])是以字典的键为参数,删除指定键的键值对。

实例14:

>> dd

{'lang': 'java', 'web': 'www.datagrand.com', 'name': 'wtf'}

>> dd.pop("name")

'wtf'

>> dd

{'lang': 'java', 'web': 'www.datagrand.com'}

值得注意的是,字典中pop函数的参数是不能省略的,这跟列表中的那个pop有所不同。

实例15:

>> dd.pop()

Traceback (most recent call last):

File "", line 1, in

TypeError: pop expected at least 1 arguments, got 0

如果删除字典中没有的键值对,也会报错:

实例16:

>> dd

{'lang': 'java', 'web': 'www.datagrand.com'}

>> dd.pop("name")

Traceback (most recent call last):

File "", line 1, in

KeyError: 'name'

popitem

>> help(dict.popitem)

popitem(...)

D.popitem() -> (k, v), remove and return some (key, value) pair as a

2-tuple; but raise KeyError if D is empty.

说明:D.popitem()与list.pop()有相似之处。

实例17:

>> dd

{'lang': 'java', 'web': 'www.datagrand.com'}

>> dd.popitem()

('lang', 'java')

>> dd

{'web': 'www.datagrand.com'}

说明:随机删除一对

>> dd.popitem()

('web', 'www.datagrand.com')

>> dd

{}

已经把字典变成空,再删:

>> dd.popitem()

Traceback (most recent call last):

File "", line 1, in

KeyError: 'popitem(): dictionary is empty'

说明:告知没有东西可删除啦

update

说明:更新字典

>> help(dict.update)

update(...)

D.update([E, ]**F) -> None. Update D from dict/iterable E and F.

If E present and has a .keys() method, does: for k in E: D[k] = E[k]

If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v

In either case, this is followed by: for k in F: D[k] = F[k]

说明:这个函数没有返回值,或者说返回值是none,它的作用就是更新字典。其参数可以是字典或者某种可迭代的对象。

实例18:

>> d1 = {"lang":"python"}

>> d2 = {"name":"wtf"}

>> d1.update(d2)

>> d1

{'lang': 'python', 'name': 'wtf'}

>> d2

{'name': 'wtf'}

说明:字典d2更新入了d1那个字典,于是d1中就多了一些内容,把d2的内容包含了进来,d2内容保持不变。

还可以以下面这种方式更新:

实例19:

>> d2

{'name': 'wtf'}

>> d2.update([("song","xingxing"),("web","www.baidu.com")])

>> d2

{'web': 'www.baidu.com', 'name': 'wtf', 'song': 'xingxing'}

has_key

说明:目前仅在python2中存在,python3中将其取消了

这个函数的功能就是判断字典中是否存在某个键,跟"k in d"类似。

>> help(dict.has_key)

has_key(...)

D.has_key(k) -> True if D has a key k, else False

实例20:

>> d2

{'web': 'www.baidu.com', 'name': 'wtf', 'song': 'xingxing'}

>> d2.has_key("web")

True

本文转自品鉴初心51CTO博客,原文链接:

http://blog.51cto.com/wutengfei/2058626

,如需转载请自行联系原作者

pythondd_python学习笔记(五)之字典2-阿里云开发者社区相关推荐

  1. freebsd mysql 安装_Freebsd中mysql安装及使用笔记-阿里云开发者社区

    Freebsd中mysql安装及使用笔记 x3d 2009-07-31 662浏览量 简介: 1.安装 一开始连mysql的软件包在freebsd中叫什么都不知道: 依稀属于databases类,先到 ...

  2. a记录 mysql_[a]-和[a]相关的内容-阿里云开发者社区

    HDOJ 1202 The calculation of GPA Problem Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的.国外大学都是计 ...

  3. 杭州内推 | 阿里云开发者社区招聘计算机视觉算法工程师(2022年毕业生)

    合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 阿里云 阿里巴巴集团拥有海量的图像/视频数据,强大的计算能力和巨大的市场空 ...

  4. rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区

    linux添加开机自启动脚本示例详解 double2li 2017-04-14 1652浏览量 简介: linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的;一.在/etc/r ...

  5. pg数据库生成随机时间_postgresql 时区与时间函数-阿里云开发者社区

    postgresql 时区与时间函数 rudygao 2016-02-03 1951浏览量 简介: --把时间戳转成epoch值 postgres=# select extract(epoch fro ...

  6. 博客同步至阿里云开发者社区,快来帮我涨人气吧

    博客同步至阿里云开发者社区,快来帮我涨人气吧! 直达链接! 直达链接! 直达链接! 直达链接! 直达链接! https://developer.aliyun.com/profile/sijaicxpx ...

  7. mysql join 索引 无效_ORACLE MYSQL中join 字段类型不同索引失效的情况-阿里云开发者社区...

    ORACLE MYSQL中join 字段类型不同索引失效的情况 重庆八怪 2016-12-29 780浏览量 简介: 关于JOIN使用不同类型的字段类型,数据库可能进行隐士转换,MYSQL ORACL ...

  8. db h2 数据类型_H2数据库函数及数据类型概述-阿里云开发者社区

    H2数据库函数及数据类型概述 jieforest 2015-01-29 573浏览量 简介: H2数据库函数及数据类型概述 一.H2数据库常用数据类型 INT类型:对应java.lang.Intege ...

  9. mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区

    关于MYSQL中FLOAT和DOUBLE类型的存储 重庆八怪 2016-04-12 844浏览量 简介: 关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方 ...

最新文章

  1. java安装_我最喜欢的Java高级开发人员书籍
  2. Hinton神经网络公开课编程练习1 The perceptron learning algorithm
  3. 苹果开始整治App Store恶意抄袭现象
  4. 机器学习实战:模型评估和优化
  5. php获取微信收款记录,微信公众号开发之微信支付代码记录的实现
  6. Python的bool类型
  7. centos6/7 yum安装mysql客户端和rpm包方式安装方式
  8. 如何配置IIS日志信息
  9. 《游戏设计师修炼之道:数据驱动的游戏设计》一1.1 风险管理的作用
  10. 【预测模型-ELAMN预测】基于遗传算法优化ELMAN神经网络实现数据回归预测matlab代码
  11. matlab做聚类分析(简单的直接用clusterdata)
  12. Android远程真机调试(电脑使用 Vysor 控制手机)
  13. 图像识别---Windows下anaconda和yolov5安装配置及简单使用
  14. EXCEL——自定义单元格格式
  15. 心脏滴血漏洞(CVE-2014-0160)分析与防护
  16. MVC3.0 中Razor 学习 cshtml文件
  17. 周鸿祎推动了中国互联网的进步
  18. Microsoft Edge浏览器打不开
  19. 串口通信基础(二)——传输方式(方向)、错误校验、传输速率与传输距离
  20. 直流电机(BLDC)转速和频率的计算关系

热门文章

  1. MongoDB 初体验:存储引擎 MMAPv1 与高内存消耗及升级迁移
  2. 第三方测评:GaussDB(for Redis)稳定性与扩容表现
  3. 如何将外链接向内连接转换?
  4. Mysql读写锁保姆级图文教程
  5. 如何极速极速搭建个人博客?Copy攻城狮用的这一招很优秀!
  6. 数据库选型入门必读:如何在眼花缭乱的产品中挑出最适合业务的?
  7. 【华为云技术分享】A-Tune:基于AI的自优化能力,让应用发挥极致性能
  8. 云享专家倪升武:微服务架构盛行的时代,你需要了解点 Spring Boot
  9. 虚拟服务器dhcp,虚拟服务器上配置dhcp服务器
  10. MATLAB中文显示乱码的问题如何解决