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)
<type 'dict'>
>> 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 "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
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)
<type 'dictionary-itemiterator'>
>> dd_iter
<dictionary-itemiterator object at 0x106f56a48>
>> 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 "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
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

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




相关文章
|
2月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
60 2
|
4月前
|
XML JSON API
如何使用Python将字典转换为XML
本文介绍了如何使用Python中的`xml.etree.ElementTree`库将字典数据结构转换为XML格式。通过定义递归函数处理字典到XML元素的转换,生成符合标准的XML文档,适用于与旧系统交互或需支持复杂文档结构的场景。示例代码展示了将一个简单字典转换为XML的具体实现过程。
38 1
|
5月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
104 1
|
5月前
|
Ubuntu Linux Python
Ubuntu学习笔记(六):ubuntu切换Anaconda和系统自带Python
本文介绍了在Ubuntu系统中切换Anaconda和系统自带Python的方法。方法1涉及编辑~/.bashrc和/etc/profile文件,更新Anaconda的路径。方法2提供了详细的步骤指导,帮助用户在Anaconda和系统自带Python之间进行切换。
249 1
|
5月前
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
938 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
5月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
232 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
5月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
271 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
5月前
|
索引 Python
Excel学习笔记(一):python读写excel,并完成计算平均成绩、成绩等级划分、每个同学分数大于70的次数、找最优成绩
这篇文章是关于如何使用Python读取Excel文件中的学生成绩数据,并进行计算平均成绩、成绩等级划分、统计分数大于70的次数以及找出最优成绩等操作的教程。
151 0
|
5月前
|
存储 安全 Serverless
Python学习四:流程控制语句(if-else、while、for),高级数据类型(字符串、列表、元组、字典)的操作
这篇文章主要介绍了Python中的流程控制语句(包括if-else、while、for循环)和高级数据类型(字符串、列表、元组、字典)的操作。
76 0
|
5月前
|
存储 自然语言处理 数据库
Python字典操作实现文章敏感词检索
Python字典操作实现文章敏感词检索
68 0

热门文章

最新文章

推荐镜像

更多