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 相关文章推荐
python实现简单温度转换的方法
Mar 13 Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 Python
用Python3创建httpServer的简单方法
Jun 04 Python
Django中数据库的数据关系:一对一,一对多,多对多
Oct 21 Python
Python2和Python3的共存和切换使用
Apr 12 Python
Python递归调用实现数字累加的代码
Feb 25 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
Django框架中表单的用法
Jun 10 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的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
利用Python实现图书超期提醒
2016/08/02 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
python版本单链表实现代码
2018/09/28 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
使用Django开发简单接口实现文章增删改查
2019/05/09 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
Django 自动生成api接口文档教程
2019/11/19 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
奥巴马演讲稿
2014/01/08 职场文书
安全口号大全
2014/06/21 职场文书
新党章心得体会
2014/09/04 职场文书
结婚司仪主持词
2015/06/29 职场文书
Python实现文字pdf转换图片pdf效果
2022/04/03 Python