如何比较python 字典值是列表字典和列表的访问速度

python两种遍历字典(dict)的方法比较
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了python两种遍历字典(dict)的方法比较,同时介绍了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带括号开始时间: 12:13:37.375000带括号结束时间: 12:13:37.375000时间间隔:0:00:00不带括号开始时间: 12:13:37.375000不带括号结束时间: 12:13:37.375000时间间隔:0:00:00
测试条数:50带括号开始时间: 12:13:57.921000带括号结束时间: 12:13:57.921000时间间隔:0:00:00不带括号开始时间: 12:13:57.921000不带括号结束时间: 12:13:57.937000时间间隔:0:00:00.016000测试条数:100带括号开始时间: 11:53:57.453000带括号结束时间: 11:53:57.468000时间间隔:0:00:00.015000不带括号开始时间: 11:53:57.468000不带括号结束时间: 11:53:57.531000时间间隔:0:00:00.063000
测试条数:150带括号开始时间: 12:00:54.812000带括号结束时间: 12:00:54.828000时间间隔:0:00:00.016000不带括号开始时间: 12:00:54.828000不带括号结束时间: 12:00:54.921000时间间隔:0:00:00.093000
测试条数:200带括号开始时间: 11:59:54.609000带括号结束时间: 11:59:54.687000时间间隔:0:00:00.078000不带括号开始时间: 11:59:54.687000不带括号结束时间: 11:59:54.734000时间间隔:0:00:00.047000
测试条数:500带括号开始时间: 11:54:39.906000带括号结束时间: 11:54:40.078000时间间隔:0:00:00.172000不带括号开始时间: 11:54:40.078000不带括号结束时间: 11:54:40.125000时间间隔:0:00:00.047000
测试条数:1000带括号开始时间: 11:54:49.171000带括号结束时间: 11:54:49.437000时间间隔:0:00:00.266000不带括号开始时间: 11:54:49.437000不带括号结束时间: 11:54:49.609000时间间隔:0:00:00.172000
测试条数:2000带括号开始时间: 11:54:58.921000带括号结束时间: 11:54:59.328000时间间隔:0:00:00.407000不带括号开始时间: 11:54:59.328000不带括号结束时间: 11:54:59.687000时间间隔:0:00:00.359000
测试条数:5000带括号开始时间: 11:55:05.781000带括号结束时间: 11:55:06.734000时间间隔:0:00:00.953000不带括号开始时间: 11:55:06.734000不带括号结束时间: 11:55:07.609000时间间隔:0:00:00.875000
测试条数:10000带括号开始时间: 11:55:15.656000带括号结束时间: 11:55:17.390000时间间隔:0:00:01.734000不带括号开始时间: 11:55:17.390000不带括号结束时间: 11:55:19.109000时间间隔:0:00:01.719000
测试条数:20000带括号开始时间: 12:19:14.921000带括号结束时间: 12:19:18.593000时间间隔:0:00:03.672000不带括号开始时间: 12:19:18.593000不带括号结束时间: 12:19:22.218000时间间隔:0:00:03.625000
我们可以看出,dict条数在200一下的时候是带括号的性能比较高一点,但是在200条以上的数据后不带括号的执行时间会少些.
下面是测试代码:
代码如下:测试Code#-*- coding: utf-8 -*-import datetime,codecs
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()
中文乱码问题有没有很好的解决办法....?
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具实际问题有哪些?
过滤掉列表[3,9,-1,10.-2......] 中负数
筛选出字典{‘li_ming’:90,’xiao_hong’:60,’li_kang’:95,’bei_men’:98} 中值高于90的项
筛选出集合{3,9,-1,10.-2......]中能被3整除的数
问题1如何解决?
  最普通方法:
#!/usr/bin/python3
def filter_l(data):
for i in data:
res.append(i)
return res
if __name__ == '__main__':
data = [3, 9, -1, 10, -2]
new_l = filter_l(data)
print(new_l)
如何解决列表问题?
   初始化列表:&生成 -10 到 10 的随机数列表,去除负数
  1.&filter方法:
#!/usr/bin/python3
from random import randint
def filter_l(data):
# 循环data列表,把值一个一个取出 交个lambda中x,如何lambda函数为True,返回x生成一个新的filter对象
return filter(lambda x: x &= 0, data)
if __name__ == '__main__':
# 列表生成10个 -10 到 10 的随机数
data = [randint(-10, 10) for _ in range(10)]
print(data)
# new_l 为可迭代对象
new_l = filter_l(data)
print(list(new_l), type(new_l))
& & & &2. 列表解析:
#!/usr/bin/python3
from random import randint
def filter_l(data):
# 循环data列表,把值一个一个取出 是否满足if条件,满足True返回x生成一个新列表
return [x for x in data if x &=0 ]
if __name__ == '__main__':
# 列表生成10个 -10 到 10 的随机数
data = [randint(-10, 10) for _ in range(10)]
print(data)
# new_l 为可迭代对象
new_l = filter_l(data)
print(list(new_l), type(new_l))
&&&&&& 运行速度比较:解析 & filter & 普通
如何解决字典?
&&&&&&&&&&&&& 字典解析,筛选数据:
#!/usr/bin/python3
from random import randint
def filter_l(data):
print(data.items())
# 把字典转换成dict_items,循环里面的key和value,满足if条件返回对应的key和value值
return {k: v for k, v in data.items() if v & 90}
if __name__ == '__main__':
# 字典生成式
data = {x: randint(0, 100) for x in range(10)}
print(data)
new_l = filter_l(data)
print(new_l, type(new_l))
  如何解决集合问题?
#!/usr/bin/python3
from random import randint
def filter_l(data):
# 迭代集合中值,满足条件为True返回x
return {x for x in data if x % 3 == 0}
if __name__ == '__main__':
# 集合生成式
data = {randint(0, 100) for x in range(10)}
print(data)
new_l = filter_l(data)
print(new_l, type(new_l))
如何逻辑整理?
&  无论是解析器还是普通方法,都需要for循环,if判断,逻辑都是满足条件返回值,过滤出满足条件的值,无论是生成器还是解析器都满足这个格式:“ 返回值 for循环 if判断 “,通过lambda满足格 式:“lambda 输入值:条件, 格式化数据
阅读(...) 评论()Python中列表和字典有什么区别,分别适用于什么场景? - 知乎13被浏览2036分享邀请回答2添加评论分享收藏感谢收起62 条评论分享收藏感谢收起查看更多回答1010人阅读
python(32)
定义字典 dic = {'a':&hello&,'b':&how&,'c':&you&}
for key in dic:
  print key,dic[key]
  print key + str(dic[key])
  a hello
  ahello
print key,dic[key],后面有个逗号,自动生成一个空格
print key + str(dic[key]),连接两个字符串,用的是加号,直接输出,中间不加逗号
for (k,v) in dic.items():
  print &dic[%s]=&%k,v
  dic[a]= hello
  dic[c]= you
  dic[b]= how
for k,v in dic.iteritems():
  print &dic[%s]=&%k,v
  dic[a]= hello
  dic[c]= you
  dic[b]= how
items()返回的是列表对象,而iteritems()返回的是iterator对象。例如:
print dic.items()&&&&&&& #[('a', 'hello'), ('c', 'you'), ('b', 'how')]
print dic.iteritems()&& #&dictionary-itemiterator object at 0x020E9A50&
深究:iteritor是迭代器的意思,一次返回一个数据项,直到没有为止
&for i in dic.iteritems():
  &print i
结果:('a', 'hello')
&&&&&&& ('c', 'you')
&&&&&&&&('b', 'how')
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2392542次
积分:37300
积分:37300
排名:第118名
原创:1162篇
转载:48篇
评论:567条
大海无边,网际无涯,本博客乃一小站,收集笔记与备忘录,供参考。基本没有原创,又基本全是原创。
(1)(19)(1)(7)(4)(7)(10)(3)(1)(3)(4)(10)(2)(1)(5)(12)(17)(10)(2)(17)(20)(4)(4)(4)(32)(13)(5)(3)(4)(12)(1)(4)(5)(11)(5)(4)(7)(17)(16)(16)(6)(29)(46)(28)(10)(11)(11)(7)(14)(10)(14)(1)(3)(14)(18)(14)(8)(31)(33)(22)(9)(33)(26)(48)(20)(81)(102)(59)(30)(1)(1)(2)(8)(12)(3)(4)(5)(16)(15)(3)(10)(33)(27)(10)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
有两个用户字典组成的列表,before 和now
要求出before 有.now中没有的列表项应该怎么求,直接用百度来的print list(set(b).difference(set(a))) # b中有而a中没有的会报错TypeError: unhashable type: 'dict'请问大神应该怎么做才能正确得到两者的差集?
before=[{u'UserName': u'@bcf67a219abccf5', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'iss', u'PYInitial': u'', u'Uin': , u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u4e00\u4e8c\u4e09', u'AttrStatus': L}, {u'UserName': u'@4babcdda51a069eb37b635f4f79bc5dfc2b5ae6ee2b', u'RemarkPYQuanPin': u'', u'DisplayName': u'\u\u7684o', u'KeyWord': u'', u'PYInitial': u'', u'Uin': , u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u\u7684', u'AttrStatus': 4133}, {u'UserName': u'@1f6ddf50c372ba088a9b8f61670a8cfa5873ede6486eac6c20e2', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u\u60e0\uff5e\u6dd8\u5b9d\u7f51\u\u', u'AttrStatus': 102469}, {u'UserName': u'@fc7c5894fcdb46bdaa173b354ef0d93cac', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u\u53d1\u5e03\u5458Summer', u'AttrStatus': 102469}, {u'UserName': u'@15b51fe0f537c8b446280bdfacd73a8adeacf6db2db096c837a0b', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u\u516b', u'AttrStatus': 4133}]
now=[{u'UserName': u'@34bc94ccd0f600f2bd25ac70c4bb66fd501caca8a8e', u'RemarkPYQuanPin': u'', u'DisplayName': u'\u\u7684o', u'KeyWord': u'', u'PYInitial': u'', u'Uin': , u'RemarkPYInitial': u'', u'PYQuanPin': u'', u'MemberStatus': 0, u'NickName': u'\u\u7684', u'AttrStatus': }, {u'UserName': u'@ddf644c522cfe5ebee374f0d42c7a7dae', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'RemarkPYInitial': u'', u'PYQuanPin': u'', u'MemberStatus': 0, u'NickName': u'\u\u60e0\uff5e\u6dd8\u5b9d\u7f51\u\u', u'AttrStatus': L}, {u'UserName': u'@bd7fc47cfb0c9a3fd2945ae46edf28c4eaaac480b92a', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'RemarkPYInitial': u'', u'PYQuanPin': u'', u'MemberStatus': 0, u'NickName': u'\u\u53d1\u5e03\u5458Summer', u'AttrStatus': 102469}]
lostlist=list(set(before).difference(set(now)))
print lostlist
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
由于两个list各包含了多个dict 假设:
list_before = [dict1{},dict2{}]
= [dict3{},dict4{}]
那么存在可能
dict1['UserName'] != dict3['UserName']
dict1['UserName'] == dict4['UserName']
假设这中情况也认为是包含相同元素的话,那么可以采用:dict{key:set(value)}的结构 利用set()的特点来找出 before有 && now没有 的集合 :
# coding: UTF-8
before=[{u'UserName':u'@bcf67a219abccf5', u'RemarkPYQuanPin':u'', u'DisplayName': u'', u'KeyWord': u'iss', u'PYInitial': u'', u'Uin': , u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u4e00\u4e8c\u4e09', u'AttrStatus': L}, {u'UserName': u'@4babcdda51a069eb37b635f4f79bc5dfc2b5ae6ee2b', u'RemarkPYQuanPin': u'', u'DisplayName': u'\u\u7684o', u'KeyWord': u'', u'PYInitial': u'', u'Uin': , u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u\u7684', u'AttrStatus': 4133}, {u'UserName': u'@1f6ddf50c372ba088a9b8f61670a8cfa5873ede6486eac6c20e2', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u\u60e0\uff5e\u6dd8\u5b9d\u7f51\u\u', u'AttrStatus': 102469}, {u'UserName': u'@fc7c5894fcdb46bdaa173b354ef0d93cac', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u\u53d1\u5e03\u5458Summer', u'AttrStatus': 102469}, {u'UserName': u'@15b51fe0f537c8b446280bdfacd73a8adeacf6db2db096c837a0b', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u\u516b', u'AttrStatus': 4133}]
now=[{u'UserName': u'@34bc94ccd0f600f2bd25ac70c4bb66fd501caca8a8e', u'RemarkPYQuanPin': u'', u'DisplayName': u'\u\u7684o', u'KeyWord': u'', u'PYInitial': u'', u'Uin': , u'RemarkPYInitial': u'', u'PYQuanPin': u'', u'MemberStatus': 0, u'NickName': u'\u\u7684', u'AttrStatus': }, {u'UserName': u'@ddf644c522cfe5ebee374f0d42c7a7dae', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'RemarkPYInitial': u'', u'PYQuanPin': u'', u'MemberStatus': 0, u'NickName': u'\u\u60e0\uff5e\u6dd8\u5b9d\u7f51\u\u', u'AttrStatus': L}, {u'UserName': u'@bd7fc47cfb0c9a3fd2945ae46edf28c4eaaac480b92a', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': L, u'RemarkPYInitial': u'', u'PYQuanPin': u'', u'MemberStatus': 0, u'NickName': u'\u\u53d1\u5e03\u5458Summer', u'AttrStatus': 102469}]
for d in before:
# add values to each set() from dicts in list_before
if isinstance(d, dict):
for k in d.keys():
if k not in re.keys():
re[k]=set()
re[k].add(d[k])
for d in now:
# remove values that in list_now's dicts
if isinstance(d, dict):
for k in d.keys():
if d[k] in
#print d[k]
re[k].remove(d[k])
#if len(re[k])&1:
re[k].remove(d[k])
for item in re.keys():
if re[item]==set([]):
# delete keys whose value is set(u'')
print item
del re[item]
---------------older----------------------
你的list中包含的是dict类型,百度的操作是set类型。所以你先要调整格式。
可以通过dict.values()来读取字典中各个key的value,然后再用set的diff操作。
要求每个字典中的各个key的value不会重复,不然set会去重。
before={'a':1,'b':2}
now={'a':1,'b':3}
lostlist=list(set(before.values()).difference(set(now.values())))
print lostlist
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
Uin才是唯一标识
dif_user=set.difference(*[{d['Uin']for d in ls}for ls in [before, now]])
objs=[d for d in before if d['Uin'] in dif_user]
print objs
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:

我要回帖

更多关于 python 列表转换字典 的文章

 

随机推荐