当前位置: 首页 > 编程笔记 >

python两种遍历字典(dict)的方法比较

鲁向明
2023-03-14
本文向大家介绍python两种遍历字典(dict)的方法比较,包括了python两种遍历字典(dict)的方法比较的使用技巧和注意事项,需要的朋友参考一下

python以其优美的语法和方便的内置数据结构,赢得了不少程序员的亲睐。
其中有个很有用的数据结构,就是字典(dict),使用非常简单。说到遍历一个dict结构,我想大多数人都会想到 for key in dictobj 的方法,确实这个方法在大多数情况下都是适用的。但是并不是完全安全,请看下面这个例子:

#这里初始化一个dict
>>> d = {'a':1, 'b':0, 'c':1, 'd':0}
#本意是遍历dict,发现元素的值是0的话,就删掉
>>> for k in d:
...   if d[k] == 0:
...     del(d[k])
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
#结果抛出异常了,两个0的元素,也只删掉一个。
>>> d
{'a': 1, 'c': 1, 'd': 0}

>>> d = {'a':1, 'b':0, 'c':1, 'd':0}
#d.keys() 是一个下标的数组
>>> d.keys()
['a', 'c', 'b', 'd']
#这样遍历,就没问题了,因为其实其实这里遍历的是d.keys()这个list常量。
>>> for k in d.keys():
...   if d[k] == 0:
...     del(d[k])
... 
>>> d
{'a': 1, 'c': 1}
#结果也是对的
>>>

其实,这个例子是我简化过的,我是在一个多线程的程序里发现这个问题的,所以,我的建议是:遍历dict的时候,养成使用 for k in d.keys() 的习惯。
不过,如果是多线程的话,这样就绝对安全吗?也不见得:当两个线程都取完d.keys()以后,如果两个线程都去删同一个key的话,先删的会成功,后删的那个肯定会报 KeyError ,这个看来只能通过其他方式来保证了。


另一篇:dict 两种遍历方式的性能对比

关于纠结dict遍历中带括号与不带括号的性能问题

for (d,x) in dict.items():
     print "key:"+d+",value:"+str(x)

for d,x in dict.items():
    print "key:"+d+",value:"+str(x)

带括号和不带括号性能测试结果:

测试结果
测试条数:15
带括号开始时间:2012-06-14 12:13:37.375000
带括号结束时间:2012-06-14 12:13:37.375000
时间间隔:0:00:00
不带括号开始时间:2012-06-14 12:13:37.375000
不带括号结束时间:2012-06-14 12:13:37.375000
时间间隔:0:00:00

测试条数:50 带括号开始时间:2012-06-14 12:13:57.921000 带括号结束时间:2012-06-14 12:13:57.921000 时间间隔:0:00:00 不带括号开始时间:2012-06-14 12:13:57.921000 不带括号结束时间:2012-06-14 12:13:57.937000 时间间隔:0:00:00.016000 测试条数:100 带括号开始时间:2012-06-14 11:53:57.453000 带括号结束时间:2012-06-14 11:53:57.468000 时间间隔:0:00:00.015000 不带括号开始时间:2012-06-14 11:53:57.468000 不带括号结束时间:2012-06-14 11:53:57.531000 时间间隔:0:00:00.063000

测试条数:150 带括号开始时间:2012-06-14 12:00:54.812000 带括号结束时间:2012-06-14 12:00:54.828000 时间间隔:0:00:00.016000 不带括号开始时间:2012-06-14 12:00:54.828000 不带括号结束时间:2012-06-14 12:00:54.921000 时间间隔:0:00:00.093000

测试条数:200 带括号开始时间:2012-06-14 11:59:54.609000 带括号结束时间:2012-06-14 11:59:54.687000 时间间隔:0:00:00.078000 不带括号开始时间:2012-06-14 11:59:54.687000 不带括号结束时间:2012-06-14 11:59:54.734000 时间间隔:0:00:00.047000

测试条数:500 带括号开始时间:2012-06-14 11:54:39.906000 带括号结束时间:2012-06-14 11:54:40.078000 时间间隔:0:00:00.172000 不带括号开始时间:2012-06-14 11:54:40.078000 不带括号结束时间:2012-06-14 11:54:40.125000 时间间隔:0:00:00.047000

测试条数:1000 带括号开始时间:2012-06-14 11:54:49.171000 带括号结束时间:2012-06-14 11:54:49.437000 时间间隔:0:00:00.266000 不带括号开始时间:2012-06-14 11:54:49.437000 不带括号结束时间:2012-06-14 11:54:49.609000 时间间隔:0:00:00.172000

测试条数:2000 带括号开始时间:2012-06-14 11:54:58.921000 带括号结束时间:2012-06-14 11:54:59.328000 时间间隔:0:00:00.407000 不带括号开始时间:2012-06-14 11:54:59.328000 不带括号结束时间:2012-06-14 11:54:59.687000 时间间隔:0:00:00.359000

测试条数:5000 带括号开始时间:2012-06-14 11:55:05.781000 带括号结束时间:2012-06-14 11:55:06.734000 时间间隔:0:00:00.953000 不带括号开始时间:2012-06-14 11:55:06.734000 不带括号结束时间:2012-06-14 11:55:07.609000 时间间隔:0:00:00.875000

测试条数:10000 带括号开始时间:2012-06-14 11:55:15.656000 带括号结束时间:2012-06-14 11:55:17.390000 时间间隔:0:00:01.734000 不带括号开始时间:2012-06-14 11:55:17.390000 不带括号结束时间:2012-06-14 11:55:19.109000 时间间隔:0:00:01.719000

测试条数:20000 带括号开始时间:2012-06-14 12:19:14.921000 带括号结束时间:2012-06-14 12:19:18.593000 时间间隔:0:00:03.672000 不带括号开始时间:2012-06-14 12:19:18.593000 不带括号结束时间:2012-06-14 12:19:22.218000 时间间隔:0:00:03.625000


我们可以看出,dict条数在200一下的时候是带括号的性能比较高一点,但是在200条以上的数据后不带括号的执行时间会少些.

下面是测试代码:

测试Code
#-*- coding: utf-8 -*-
import datetime,codecs

dict = {}

for i in xrange(0,20000):     dict.setdefault("name"+str(i))     dict["name"+str(i)]="name"

s=codecs.open(r'c:\\dict.txt','a', 'utf-8')

def write(des):     s.write(des.decode("utf-8"))

write("测试条数:") write(str(len(dict))+"\r\n") write("带括号开始时间:") a=datetime.datetime.now() s.write(str(a)+"\r\n")

for (d,x) in dict.items():     print "key:"+d+",value:"+str(x) write("带括号结束时间:") b=datetime.datetime.now() write(str(b)+"\r\n") write("时间间隔:") write(str(b-a)+"\r\n")

write("不带括号开始时间:") c=datetime.datetime.now() write(str(c)+"\r\n") for d,x in dict.items():     print "key:"+d+",value:"+str(x) write("不带括号结束时间:") d=datetime.datetime.now() write(str(d)+"\r\n") write("时间间隔:") write(str(d-c)+"\r\n") write("\r\n") s.close()

中文乱码问题有没有很好的解决办法....?

 类似资料:
  • 本文向大家介绍python字典的遍历3种方法详解,包括了python字典的遍历3种方法详解的使用技巧和注意事项,需要的朋友参考一下 遍历字典: keys() 、values() 、items()   1. xxx.keys() : 返回字典的所有的key 返回一个序列,序列中保存有字典的所有的键   效果图:   代码: 2. xxx.values() : 返回字典所有的值   效果图:   代码

  • 本文向大家介绍Python中实现两个字典(dict)合并的方法,包括了Python中实现两个字典(dict)合并的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python中实现两个字典(dict)合并的方法,分享给大家供大家参考。具体方法如下: 现有两个字典dict如下: 合并两个字典得到类似: 方法1: 方法2: 方法2等同于: 或者: 方法2比方法1速度快很多,用timeit测

  • 主要内容:Python创建字典,Python 访问字典,Python删除字典Python 字典(dict)是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。相对地,列表(list)和元组(tuple)都是有序的序列,它们的元素在底层是挨着存放的。 字典类型是 Python 中唯一的映射类型。“映射”是数学中的术语,简单理解,它指的是元素之间相互对应的关系,即通过一个元素,可以唯一找到另一个元素。如图 1 所示。 图 1 映射关系示意图 字典中

  • 本文向大家介绍Python中的字典遍历备忘,包括了Python中的字典遍历备忘的使用技巧和注意事项,需要的朋友参考一下 备忘一下python中的字典如何遍历,没有什么太多技术含量.仅供作为初学者的我参考. interitems和iterms区别 参考 http://stackoverflow.com/questions/10458437/python-what-is-the-difference-

  • 问题内容: 我的代码是 似乎可以很好地打印索引= 0的字典键的值。 但是对于我的一生,我无法弄清楚如何将for循环放入for循环中,以循环访问未知数量的字典。 问题答案: 你可以只遍历的索引的你的: 或者您可以使用带有计数器的while循环: 您甚至可以直接遍历列表中的元素: 只需迭代字典的值,甚至可以不进行任何查找: 或将迭代包装在列表理解或生成器中,然后再将其解压缩: 可能性是无止境。选择哪种

  • 主要内容:keys()、values() 和 items() 方法,copy() 方法,update() 方法,pop() 和 popitem() 方法,setdefault() 方法我们知道, Python 字典的数据类型为 dict,我们可使用 来查看该类型包含哪些方法,例如: >>> dir(dict) ['clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update'