python唯一映射类型_Python基础:04映射类型

字典是Python语言中唯一的映射类型。一个字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象。字典中的数据是无序排列的。

映射类型也可被称做哈希表,哈希表的算法是获取键,对键执行一个叫做哈希函数的操作,并根据计算的结果,选择在数据结构的某个地址中来存储值。任何一个值存储的地址皆取决于它的键。正因为这种随意性,哈希表中的值是没有顺序的。哈希表一般有很好的性能,因为用键查询相当快。

一:创建字典

1:dict()

从Python2.2版本起,可以用工厂方法 dict() 来创建字典。

如果不提供参数,会生成空字典。若参数是可以迭代的,如序列、迭代器,或是一个支持迭代的对象,那每个可迭代的元素必须成对出现。在每个值对中,第一个元素是字典的键、第二个元素是字典中的值。例子:

>>> fdict = dict((['x', 1], ['y', 2]))>>>fdict

{'y': 2, 'x': 1}>>> dict(zip(('x', 'y'), (1, 2)))

{'y': 2, 'x': 1}>>> dict([('xy'[i-1], i) for i in range(1,3)])

{'y': 2, 'x': 1}

如果输入参数是(另)一个映射对象,比如,一个字典对象,对其调用dict()会从存在的字典里复制内容来生成新的字典。新生成的字典是原来字典对象的浅复制版本, 它与用字典的内建方法copy() 生成的字典对象是一样的。但是copy()更快,所以推荐使用copy()。

从Python2.3 开始,dict()方法可以接受关键字参数字典:

>>> dict(x=1, y=2)

{'y': 2, 'x': 1}

2:fromkeys()

从Python2.3 版本起, 可以用内建方法fromkeys()来创建一个"默认"字典,字典中元素具有相同的值 (如果没有给出, 默认为None):

>>> ddict = {}.fromkeys(('x', 'y'), -1)>>>ddict

{'y': -1, 'x': -1}>>> edict = {}.fromkeys(('foo', 'bar'))>>>edict

{'foo': None, 'bar':None}

二:访问字典

从Python2.2 开始,可以不必再用keys()方法获取供循环使用的键值列表了。 可以用迭代器来轻松地访问类序列对象(sequence-like objects),比如字典和文件。只需要用字典的名字就可以在 for 循环里遍历字典。

>>> dict2 = {'name': 'earth', 'port': 80}>>>> for key indict2:

...print 'key=%s, value=%s' %(key, dict2[key])

...

key=name, value=earth

key=port, value=80

要得到字典中某个元素的值, 可以用字典的键查找操作符([ ]):

>>> dict2['name']'earth'

使用[ ]时,如果在这个字典中没有对应的键,将会产生一个错误:

>>> dict2['server']

Traceback (innermost last):

File"", line 1, in?

KeyError: server

检查一个字典中是否有某个键,是用字典的 has_key()方法, 或者另一种比较好的方法就是从2.2 版本起用的,in 或 not in 操作符。

三:更新和删除字典

1:更新

字典的键查找操作符([ ]),既可以用于从字典中取值,也可以用于给字典赋值。如果字典中该键已经存在,则字典中该键对应的值将被新值替代。如果改键不存在,则相当于增加新条目:

>>> dict2['name'] = 'venus' #更新已有条目

>>> dict2['arch'] = 'sunos5' #增加新条目

2:删除

以下是删除字典和字典元素的例子:

del dict2['name']             # 删除键为“name”的条目

dict2.clear()                     # 删除dict2 中所有的条目

del dict2                           #删除整个dict2 字典

dict2.pop('name')            #删除并返回键为“name”的条目

四:字典的比较

字典的比较不是很有用也不常见。比较算法按照以下的顺序:

(1)比较字典长度

如果字典的长度不同,那么用cmp(dict1, dict2) 比较大小时,如果字典 dict1 比 dict2 长,cmp()返回正值,如果 dict2 比 dict1 长,则返回负值。也就是说,字典中的键的个数越多,这个字典就越大。

(2)比较字典的键

如果两个字典的长度相同,那就按字典的键比较;键比较的顺序和 keys()方法返回键的顺序相同。这时,如果两个字典的键不匹配时,对这两个(不匹配的键)直接进行比较。当dict1 中第一个不同的键大于dict2 中第一个不同的键,cmp()会返回正值。

(3)比较字典的值

如果两个字典的长度相同而且它们的键也完全匹配,则用字典中每个相同的键所对应的值进行比较。一旦出现不匹配的值,就对这两个值进行直接比较。若dict1 比dict2 中相同的键所对应的值大,cmp()会返回正值。

(4) 完全匹配

到此为止,每个字典有相同的长度、相同的键、每个键也对应相同的值,则字典完全匹配,cmp函数返回0 值。

五:字典的键

大多数Python对象都可以作为键;但它们必须是可哈希的对象。所有不可变的类型都是可哈希的,因此它们都可以做为字典的键。像列表和字典这样的可变类型,由于它们不是可哈希的,所以不能作为键。

在执行中字典中的键不允许被改变。比如创建了一个字典,字典中包含一个元素(一个键和一个值)。可能是由于某个变量的改变导致键发生了改变。这时候你如果用原来的键来取出字典里的数据,会得到KeyError。现在你没办法从字典中获取该值了,因为键本身的值发生了变化。由于上面的原因,字典中的键必须是可哈希的, 所以数字和字符串可以作为字典中的键, 但是列表和其他字典不行。

一个要说明的是问题是数字:值相等的数字表示相同的键。换句话来说,整型数字 1 和 浮点数 1.0 的哈希值是相同的,即它们是相同的键。

也有一些可变对象(很少)是可哈希的,它们可以做字典的键,但很少见。举一个例子,一个实现了__hash__() 特殊方法的类。因为__hash__()方法返回一个整数,所以仍然是用不可变的值(做字典的键)。

数字和字符串可以被用做字典的键,元组虽然是不可变的,但是元组也有可能包含可变对象。所以用元组做有效的键,必须要加限制:元组中只包括像数字和字符串这样的不可变参数,才可以作为字典中有效的键。

六:映射类型相关函数

内建函数hash()可以判断某个对象是否可以做一个字典的键。将一个对象作为参数传递给 hash(), 会返回这个对象的哈希值。 只有这个对象是可哈希的,才可作为字典的键 (函数的返回值是整数,不产生错误或异常)。

如果非可哈希类型作为参数传递给hash()方法,会产生TypeError 错误(因此,如果使用这样的对象作为键给字典赋值时会出错):

>>>hash([])

Traceback (innermost last): File"", line 1, in?

TypeError: list objects are unhashable>>>

>>> dict2[{}] = 'foo'Traceback (most recent call last): File"", line 1, in?

TypeError: dict objects are unhashable

七:映射类型内建方法

1:keys()方法,返回一个列表,包含字典中所有的键(的副本)。

2:values()方法,返回一个列表,包含字典中所有的值(的副本)。

3:items(),返回一个包含所有(键, 值)元组(的副本)的列表。这些方法在不按任何顺序遍历字典的键或值时很有用。

>>>dict2.keys()

['port', 'name']>>>dict2.values()

[80, 'earth']>>>dict2.items()

[('port', 80), ('name', 'earth')]

4:dict.get(key, default=None)

对字典dict中的键key,返回它对应的值value,如果字典中不存在此键,则返回default的值,参数default的默认值为None,所以该函数不会引发KeyError异常。该函数也不会改变字典。

5:dict.pop(key [, default])

如果字典中key键存在,删除并返回dict[key],如果key 键不存在,但是给出了default参数,则返回default。如果没有给出default且key不存在,则引发KeyError 异常。该函数有可能改变字典。

6:update()方法可以用来将一个字典的内容添加到另外一个字典中。字典中原有的键如果与新添加的键重复,那么重复键所对应的原有条目的值将被新键所对应的值所覆盖。原来不存在的条目则被添加到字典中。

7:clear()方法可以用来删除字典中的所有的条目。

>>> dict2= {'host':'earth', 'port':80}>>> dict3= {'host':'venus', 'server':'http'}>>>dict2.update(dict3)>>>dict2

{'server': 'http', 'port': 80, 'host': 'venus'}>>>dict3.clear()>>>dict3

{}

8:copy()方法返回一个字典的副本。注意这只是浅复制。

9:setdefault(key [,default])是自2.0才有的内建方法, 使得代码更加简洁。它实现了常用的语法:如果字典中key存在,则不改变字典,直接返回它的值。如果所找的key在字典中不存在,则给这个键赋default并返回default,default默认为None。

>>> myDict = {'host': 'earth', 'port': 80}>>> myDict.setdefault('port', 8080)80

>>> myDict.setdefault('prot', 'tcp')'tcp'

>>>myDict.items()

[('prot', 'tcp'), ('host', 'earth'), ('port', 80)]

10:因keys(),items(), 和 values()方法的返回值都是列表。数据集如果很大会导致很难处理,因此iteritems(), iterkeys(), 和itervalues() 方法被添加到 Python2.2 中。这些函数与返回列表的对应方法相似,只是它们返回惰性赋值的迭代器,所以节省内存。

八:其他

要避免使用内建对象名字作为变量的标识符。不要用 dict, list, file, bool, str, input, len 这样的内建类型为变量命名。

>>> print 'host %(name)s is runningon port %(port)d' %dict2

host venusis running on port 6969

上面的print语句展示了另一种使用字符串格式符( %)的方法。用字典参数可以简化print 语句,因为这样做你只须用到一次该字典的名字,而不用在每个元素出现的时候都用元组参数表示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝马屏幕共享android,宝马屏幕共享功能怎么用

【太平洋汽车网】使用宝马屏幕共享要先打开车载电脑多媒体功能,再选择屏幕共享手机投屏,勾掉宝马互联选项,然后再打开手机wifi,选择BMW输入密码即可使用屏幕共享。车手机互联映射即车机互联,就是将手机投屏到车载显示器…

“用于无监督图像生成解耦的正交雅可比正则化”论文解读

Tikhonov regularization terms https://blog.csdn.net/jiejinquanil/article/details/50411617 本文是对博客https://baijiahao.baidu.com/s?id1710942953471566583&wfrspider&forpc的重写。 1 简介 本文是对发表于计算机视觉和模式识别领域的顶级会议 ICCV 2021 的…

html带正方形项目列表,5种简单实用的css列表样式实例,可以直接用到项目中。...

谁不希望有一个好看而又干净的列表?这篇文章中我们给出几个实用的例子,你可以把他们直接用到自己的工作中。我们从一个带有动画效果的垂直列表开始,接着是一个图文混排的例子,然后是一个只有图片的list例子跟一个水平菜单的例子&a…

python变量和常量_python 变量与常量 - 刘江的python教程

变量与常量阅读: 17356评论:7变量:在程序运行过程中,值会发生变化的量常量:在程序运行过程中,值不会发生变化的量无论是变量还是常量,在创建时都会在内存中开辟一块空间,用于保存它的值。Python…

代价敏感多标签主动学习的代码开发跟踪

1 简介 代价敏感多标签主动学习目前是闵老师小组正在进行的一个开发项目,目的是将代价敏感和主动学习思想应用到多标签学习中。整个Java代码涵盖了很多技术:并行计算、batch处理。本文就是在学习这个代码后的一些总结。学习方法采用的至顶向下。 2 Cma…

pb 打印html页面,用PB开发WEB应用

用PB开发WEB应用用PB开发WEB应用烟台教育学院网络中心 孙连三一、PB Window plug -in 的用途PowerBuilder Window plug -in 的用途是在HTML 页面中插入PowerBuilder 中定义的窗口对象,此窗口对象上定义的功能在浏览器中一样被执行&#xff0…

python上传文件接口_python程序的web接口:上传和下载文件

我正在尝试制作一个简单的web应用程序,其中可以上载一个文件并将该文件提供给python脚本。烧瓶似乎适合这种用途。然后,用户可以从脚本下载文件输出。请告诉我如何解析python脚本中的文件并获得输出。到目前为止,我成功地完成了以下上载文件的…

两列布局 html5,CSS两列布局的N种实现

原理:两个元素都设置dislpay:inline-block,为了消除html空格的影响,父元素的font-size需要设置为0,右侧自适应元素的宽度使用calc函数计算。如果两个元素的高度不一样,可以给元素设置vertical-align:top调整。缺点&…

python如何提取图片特征向量_在python中计算图像的特征向量

我正在尝试将二维高斯拟合到图像中。噪声很低,所以我试图旋转图像,使两个主轴不同时变化,算出最大值,然后计算两个维度的标准偏差。选择的武器是Python。。然而,我一直在寻找图像的特征向量——numpy.linalg.py假设离散…

2021年9月24日和学生隆兴的学术讨论

QRCode: (1)做实验 (2)了解它的基本原理 调包侠 语言: (1)程序设计语言(交流,不规范) (2)数学(语言) &#x…

html加上百度统计,vue单页面应用加入百度统计

版权声明:本文为CSDN博主「钟文辉」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_39753974/article/details/80322643在单页面中,要是只加在head中的话那…

推荐系统:猜你喜欢

0 简介 网络的迅速发展带来了信息超载(information overload)问题。解决信息超载问题一个非常有潜力的办法是推荐系统,它根据用户的信息需求、兴趣等,将用户感兴趣的信息、产品等推荐给用户。推荐系统最典型应用领域是电子商务领…

量子计算机九章能否预测未来,张礼立 : 中国 “九章”量子计算机到底厉害在哪?...

原标题:张礼立 : 中国 “九章”量子计算机到底厉害在哪?【背景信息】12月4日,《科学》杂志公布了 中国 “九章” 的重大突破。 这台由中国科学技术大学潘建伟、陆朝阳等学者研制的76个光子的量子计算原型机,推动全球量…

python的继承用法_python中继承有什么用法?python继承的用法详解

本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。面向对象三大特征1.封装:根据职责将属性和方法封装到一个抽象的类中2.继…

利用GAN实现QR Code超分辨率的研究

文章目录1 传统方案2 基于CNN的实现方案2.1 SRCNN2.2 WeChat AI3 基于GAN的实现方案3.1 SRGAN3.2 ESRGAN3.3 Real-ESRGAN4 基于GAN的QR Code的实现方案1 传统方案 https://blog.csdn.net/caomin1hao/article/details/81092134?utm_mediumdistribute.pc_relevant.none-task-bl…

HTML5清除2个div标签的空白,DIV标签里面IMG图片下方留有空白怎么办

我们很多个人博客网站都会广告位投放一些图片广告,在网页设计中,图片是不可缺少的素材,但是在 div 标签里面放入 img 图片的话,有时候会在图片的下方出现一行空间的区域,如果单纯的图片不醒目或是图片所在的位置不重要…

python notebook软件_Jupyter notebook快速入门教程(推荐)

本文主要介绍了Jupyter notebook快速入门教程,分享给大家,具体如下:本篇将给大家介绍一款超级好用的工具:Jupyter notebook。为什么要介绍这款工具呢?如果你想使用Python学习数据分析或数据挖掘,那么它应该…

推荐系统国内外团队介绍

1 何向南团队 http://staff.ustc.edu.cn/~hexn/

如何用计算机截部分屏,电脑如何长屏幕的截图?电脑截取长屏的方法

新手用户对windows系统截取长屏的方法比较陌生,正常情况下,我们截取屏幕内容是登录QQ,按ctrlalta来截取屏幕的,只能截取部分内容,无法截图整个页面。日常的工作生活中,截图是经常会用到的,如果你…

Audio-based snore detection using deep neural networks解读

0 摘要 Background and Objective: 打鼾是一种普遍现象。 它可能是良性的,但也可能是阻塞性睡眠呼吸暂停 (OSA) 一种普遍存在的睡眠障碍的症状。 准确检测打鼾可能有助于筛查和诊断 OSA。 Methods: 我们介绍了一种基于卷积神经网络 (CNN) 和循环神经网络 (RNN) 组合…