pythondd_python学习笔记(五)之字典2-阿里云开发者社区
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-阿里云开发者社区相关推荐
- freebsd mysql 安装_Freebsd中mysql安装及使用笔记-阿里云开发者社区
Freebsd中mysql安装及使用笔记 x3d 2009-07-31 662浏览量 简介: 1.安装 一开始连mysql的软件包在freebsd中叫什么都不知道: 依稀属于databases类,先到 ...
- a记录 mysql_[a]-和[a]相关的内容-阿里云开发者社区
HDOJ 1202 The calculation of GPA Problem Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的.国外大学都是计 ...
- 杭州内推 | 阿里云开发者社区招聘计算机视觉算法工程师(2022年毕业生)
合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 阿里云 阿里巴巴集团拥有海量的图像/视频数据,强大的计算能力和巨大的市场空 ...
- rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区
linux添加开机自启动脚本示例详解 double2li 2017-04-14 1652浏览量 简介: linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的;一.在/etc/r ...
- pg数据库生成随机时间_postgresql 时区与时间函数-阿里云开发者社区
postgresql 时区与时间函数 rudygao 2016-02-03 1951浏览量 简介: --把时间戳转成epoch值 postgres=# select extract(epoch fro ...
- 博客同步至阿里云开发者社区,快来帮我涨人气吧
博客同步至阿里云开发者社区,快来帮我涨人气吧! 直达链接! 直达链接! 直达链接! 直达链接! 直达链接! https://developer.aliyun.com/profile/sijaicxpx ...
- mysql join 索引 无效_ORACLE MYSQL中join 字段类型不同索引失效的情况-阿里云开发者社区...
ORACLE MYSQL中join 字段类型不同索引失效的情况 重庆八怪 2016-12-29 780浏览量 简介: 关于JOIN使用不同类型的字段类型,数据库可能进行隐士转换,MYSQL ORACL ...
- db h2 数据类型_H2数据库函数及数据类型概述-阿里云开发者社区
H2数据库函数及数据类型概述 jieforest 2015-01-29 573浏览量 简介: H2数据库函数及数据类型概述 一.H2数据库常用数据类型 INT类型:对应java.lang.Intege ...
- mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区
关于MYSQL中FLOAT和DOUBLE类型的存储 重庆八怪 2016-04-12 844浏览量 简介: 关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方 ...
最新文章
- java安装_我最喜欢的Java高级开发人员书籍
- Hinton神经网络公开课编程练习1 The perceptron learning algorithm
- 苹果开始整治App Store恶意抄袭现象
- 机器学习实战:模型评估和优化
- php获取微信收款记录,微信公众号开发之微信支付代码记录的实现
- Python的bool类型
- centos6/7 yum安装mysql客户端和rpm包方式安装方式
- 如何配置IIS日志信息
- 《游戏设计师修炼之道:数据驱动的游戏设计》一1.1 风险管理的作用
- 【预测模型-ELAMN预测】基于遗传算法优化ELMAN神经网络实现数据回归预测matlab代码
- matlab做聚类分析(简单的直接用clusterdata)
- Android远程真机调试(电脑使用 Vysor 控制手机)
- 图像识别---Windows下anaconda和yolov5安装配置及简单使用
- EXCEL——自定义单元格格式
- 心脏滴血漏洞(CVE-2014-0160)分析与防护
- MVC3.0 中Razor 学习 cshtml文件
- 周鸿祎推动了中国互联网的进步
- Microsoft Edge浏览器打不开
- 串口通信基础(二)——传输方式(方向)、错误校验、传输速率与传输距离
- 直流电机(BLDC)转速和频率的计算关系