Python中dictionary items()系列函数的用法实例


Posted in Python onAugust 21, 2014

本文实例讲述了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程序设计有一定的借鉴价值。

Python 相关文章推荐
仅用50行Python代码实现一个简单的代理服务器
Apr 08 Python
Python的dict字典结构操作方法学习笔记
May 07 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
Pyinstaller将py打包成exe的实例
Mar 31 Python
dataframe 按条件替换某一列中的值方法
Jan 29 Python
详解python中的数据类型和控制流
Aug 08 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
解决python3.6用cx_Oracle库连接Oracle的问题
Dec 07 Python
python利用pytesseract 实现本地识别图片文字
Dec 14 Python
Python 不同对象比较大小示例探讨
Aug 21 #Python
python字符串连接方式汇总
Aug 21 #Python
零基础学Python(一)Python环境安装
Aug 20 #Python
Python中replace方法实例分析
Aug 20 #Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 #Python
Python中列表(list)操作方法汇总
Aug 18 #Python
Python中多线程thread与threading的实现方法
Aug 18 #Python
You might like
PHP 面向对象 final类与final方法
2010/05/05 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
PHP实现显示照片exif信息的方法
2014/07/11 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
用JavaScript隐藏控件的方法
2009/09/21 Javascript
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
小学教研工作制度
2014/01/15 职场文书
车辆转让协议书
2014/09/24 职场文书
单位委托书
2014/10/15 职场文书
上课说话检讨书
2015/01/27 职场文书
子女赡养老人协议书
2016/03/23 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
Go语言测试库testify使用学习
2022/07/23 Golang