Python中dictionary items()系列函数的用法实例
作者:shichen2014 发布时间:2023-11-23 08:03:03
本文实例讲述了Python中dictionary items()系列函数的用法,对Python程序设计有很好的参考借鉴价值。具体分析如下:
先来看一个示例:
import html # available only in Python 3.x
def make_elements(name, value, **attrs):
keyvals = [' %s="%s"' % item for item in attrs.items()]
attr_str = ''.join(keyvals)
element = '<{name}{attrs}>{value}</{name}>'.format(
name = name,
attrs = attr_str,
value = html.escape(value))
return element
make_elements('item', 'Albatross', size='large', quantity=6)
make_elements('p', '<spam>')
该程序的作用很简单,就是生成HTML标签,注意html这个模块只能在Python 3.x才有。
起初我只是注意到,生成标签属性列表的keyvals这个dictionary类型变量构建的方式很有意思,两个%s对应一个item,所以就查阅了相关的资料,结果扯出了挺多的东西,在此一并总结。
注:下面所有Python解释器使用的版本,2.x 对应的是2.7.3,3.x 对应的是3.4.1
在 Python 2.x 里,官方文档里items的方法是这么说明:生成一个 (key, value) 对的list,就像下面这样:
>>> d = {'size': 'large', 'quantity': 6}
>>> d.items()
[('quantity', 6), ('size', 'large')]
在搜索的过程中,无意看到stackoverflow上这样一个问题:dict.items()和dict.iteritems()有什么区别? ,第一个答案大致的意思是这样的:
“起初 items() 就是返回一个像上面那样的包含dict所有元素的list,但是由于这样太浪费内存,所以后来就加入了(注:在Python 2.2开始出现的)iteritems(), iterkeys(), itervalues()这一组函数,用于返回一个 iterator 来节省内存,但是在 3.x 里items() 本身就返回这样的 iterator,所以在 3.x 里items() 的行为和 2.x 的 iteritems() 行为一致,iteritems()这一组函数就废除了。”
不过更加有意思的是,这个答案虽然被采纳,下面的评论却指出,这种说法并不准确,在 3.x 里 items() 的行为和 2.x 的 iteritems() 不一样,它实际上返回的是一个"full sequence-protocol object",这个对象能够反映出 dict 的变化,后来在 Python 2.7 里面也加入了另外一个函数 viewitems() 和 3.x 的这种行为保持一致
为了证实评论中的说法,我做了下面的测试,注意观察测试中使用的Python版本:
测试1(Python 2.7.3):
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {'size': 'large', 'quantity': 6}
>>> il = d.items()
>>> it = d.iteritems()
>>> vi = d.viewitems()
>>> il
[('quantity', 6), ('size', 'large')]
>>> it
<dictionary-itemiterator object at 0x7fe555159f18>
>>> vi
dict_items([('quantity', 6), ('size', 'large')])
测试2(Python 3.4.1):
Python 3.4.1 (default, Aug 12 2014, 16:43:01)
[GCC 4.9.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {'size': 'large', 'quantity': 6}
>>> il = d.items()
>>> it = d.iteritems()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'iteritems'
>>> vi = d.viewitems()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'viewitems'
>>> il
dict_items([('size', 'large'), ('quantity', 6)])
可以看到在 Python 3.x 里面,iteritems() 和 viewitems() 这两个方法都已经废除了,而 item() 得到的结果是和 2.x 里面 viewitems() 一致的。
2.x 里 iteritems() 和 viewitems() 返回的内容都是可以用 for 来遍历的,像下面这样
>>> for k, v in it:
... print k, v
...
quantity 6
size large
>>> for k, v in vi:
... print k, v
...
quantity 6
size large
这两者的区别体现在哪里呢?viewitems() 返回的是view object,它可以反映出 dictionary 的变化,比如上面的例子,假如在使用 it 和 vi 这两个变量之前,向 d 里面添加一个key-value组合,区别就很容易看出来了。
>>> it = d.iteritems()
>>> vi = d.viewitems()
>>> d['newkey'] = 'newvalue'
>>> d
{'newkey': 'newvalue', 'quantity': 6, 'size': 'large'}
>>> vi
dict_items([('newkey', 'newvalue'), ('quantity', 6), ('size', 'large')])
>>> it
<dictionary-itemiterator object at 0x7f50ab898f70>
>>> for k, v in vi:
... print k, v
...
newkey newvalue
quantity 6
size large
>>> for k, v in it:
... print k, v
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
在第三行中,我们像 d 里面插入了一个新的元素,vi 可以继续遍历,而且新的遍历能够反映出 d 的变化,但是在遍历 it 的时候,报错提示 dictionary 在遍历的时候大小发生了变化,遍历失败。
总结起来,在 2.x 里面,最初是 items() 这个方法,但是由于太浪费内存,所以加入了 iteritems() 方法,用于返回一个 iterator,在 3.x 里面将 items() 的行为修改成返回一个 view object,让它返回的对象同样也可以反映出原 dictionary 的变化,同时在 2.7 里面又加入了 viewitems() 向下兼容这个特性。
所以在 3.x 里面不需要再去纠结于三者的不同之处,因为只保留了一个 items() 方法。
相信本文所述示例对大家的Python程序设计有一定的借鉴价值。


猜你喜欢
- 前言对MySQL有研究的读者,可能会发现MySQL更新很快,在安装方式上,MySQL提供了两种经典安装方式:解压式和一键式,虽然是两种安装方
- 如下所示:$ary = array( array('t'=>1,'y'=>2), &
- 如下所示:list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] slice = random.sample(list
- 背景:pytest以特定规则搜索测试用例,所以测试用例文件、测试类以及类中的方法、测试函数这些命名都必须符合规则,才能被pytest搜索到并
- 本文实例为大家分享了python rsync服务器之间文件夹同步的具体代码,供大家参考,具体内容如下About rsync配置两
- ImageDraw模块提供了图像对象的简单2D绘制。用户可以使用这个模块创建新的图像,注释或润饰已存在图像,为web应用实时产生各种图形。P
- 条件去官网下载.war和.msi文件夹https://www.jenkins.io第一条线是war第二条线是msi保存到的地方(根据你的电脑
- 1 减少HTTP请求数量 (Minimize HTTP Requests) tag:content80%的用户响应时间被花费在前端
- 前面两天带着大家换了一个口味,带着大家学习了pyecharts的原理和部分图形制作。今天我们继续回归带你学MySQL系列,带着大家继续学习M
- 1、问题描述:在学习北京大学曹健老师的tensorflow2.0笔记的时候,遇到了[Errno 2] No such file or dir
- 视图代码lis = []#设置一个空列表用来存放发送的验证码,用来验证def yzm1(): res1 = &qu
- 前言1.工作中,经常需要合并多个Excel文件。如果文件数量比较多,则工作量大,易出错,此时,可以使用Python来快速的完成合并。2.使用
- 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层。本文所构建的神经网络隐藏层只有一层。一个
- 先给大家分享JQuery判断radio单选框是否选中并获取值的方法https://www.aspxhome.com/article/1548
- 1 Python自动绘图在这里我主要运用了pyautocad库进行AutoCAD的自动化操作,pyautocad是一款功能非常强大的Auto
- 前言此文记录了我在进行 Anaconda 环境变量配置的做法 ,希望可以对有需要的朋友们有所帮助或者启发一、什么是环境变量环境变量一般是指操
- gjsonGJSON 是一个Go包,它提供了一种从json文档中获取值的快速简单的方法。它具有单行检索、点符号路径、迭代和解析 json 行
- INSTR (源字符串, 目标字符串, 起始位置, 匹配序号) 在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的
- 由于python多线程无法发挥多核的作用,因此当计算量很大的时候就需要考虑多进程。只不过多进程比较麻烦一些,进程中通信向来是一件麻烦事。py
- 需求说明:在开发 vue 项目的过程中遇到的需求是要把 api 接口前缀暴露在命令行,通过 npm run build apiUrl 即可修