请问这段代码(为列表中的字典元素去重复)如何能写成列表表达式呢

2013-08-21 22:51:04 +08:00
 pinkman
>>> t1 = [{'a':1},{'a':1},{'b':2}]
>>> t11 = []
>>> for i in t1:
if i not in t11:
t11.append(i)
5547 次点击
所在节点    Python
9 条回复
VYSE
2013-08-21 23:01:11 +08:00
你把{}变成()
t1 = [('a',1),('a',1),('b',2)]
一个dict不久搞定了?
d1 = dict(t1)
ipconfiger
2013-08-21 23:08:00 +08:00
[{k:v} for k,v in dict([list(d.iteritems())[0] for d in t1]).iteritems()]

搞定收工
pinkman
2013-08-21 23:12:01 +08:00
@ipconfiger 厉害!但看起来好难懂啊,我还是用最简单我原来的方法算了
saturnisbig
2013-08-21 23:13:35 +08:00
ipconfiger
2013-08-21 23:51:29 +08:00
@pinkman 随手写的写复杂了点
[{k:v} for k,v in dict([d.items()[0] for d in t1]).items()]
简化后就这样了,其实dict([d.items()[0] for d in t1]).items() 以外的部分纯粹是为了把列表内还原成一个个字典
jokaye
2013-08-22 09:35:06 +08:00
[t11.append(t) for t in t1 if t not in t11] ?
pinkman
2013-08-22 09:47:23 +08:00
@jokaye 原来如此,还是需要先生成个t11 = []的空字典,随后的list表达式就好写了,之前我就一直在想不自己先定义t11(因为考虑到列表表达式本来就要生成列表),所以才老是想不出来,现在清楚了,感谢jokaye
mengzhuo
2013-08-22 11:37:00 +08:00
[t11.append(t) for t in l if t not in t11]
1000000 loops, best of 3: 793 ns per loop
# 不过话说这么个复杂度是2n吧

[dict(t) for t in set([tuple(d.items()) for d in l])]
100000 loops, best of 3: 9.25 us per loop

[{k:v} for k,v in dict([list(d.iteritems())[0] for d in t1]).iteritems()]
100000 loops, best of 3: 10.4 us per loop

[{k:v} for k,v in dict([d.items()[0] for d in t1]).items()]
100000 loops, best of 3: 5.01 us per loop
# 这个很漂亮

---------------------------

升级一下测试:
t2 = [{random.randint(0, 4095):1} for k in xrange(9999)]
len([d for d in t2 if t2.count(d) > 1]) # 这次随机出9144项重复的

[t22.append(t) for t in t2 if t not in t22]
1 loops, best of 3: 1.54 s per loop
# 直接跪了 = =

[dict(t) for t in set([tuple(d.items()) for d in t2])]
10 loops, best of 3: 21.9 ms per loop

[{k:v} for k,v in dict([list(d.iteritems())[0] for d in t2]).iteritems()]
10 loops, best of 3: 26 ms per loop

[{k:v} for k,v in dict([d.items()[0] for d in t2]).items()]
100 loops, best of 3: 11.4 ms per loop
# 用iter,会更好
[{k:v} for k,v in dict([d.items()[0] for d in t2]).iteritems()]
100 loops, best of 3: 10.7 ms per loop
mengzhuo
2013-08-22 11:57:21 +08:00
我觉得黑魔法了的一种方法:
[{k:v} for k,v in dict([d.iteritems().next() for d in t2]).iteritems()]
100 loops, best of 3: 10.4 ms per loop

不过性能没啥提升了,还是@ipconfiger 的iter版给力了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/79803

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX