作为最常用的数据结构,但是我一直都觉得自己是个lowbi,历史如下:
V1
实现一个list计数的功能,我以前经常这么写
foo_dict = {}
for i in a_list:
if i in foo_dict:
foo_dict[i] += 1
else:
foo_dict[i] =1
V2
现在看来简直low逼了
稍微改进一点的话实际上应该这么用:
foo_dict = {}
for i in a_list:
foo_dict.set_default(i,0)
foo_dict[i] += 1
这样代码的复杂度就降了一个
ps
set_default可以认为是get的反操作.
另外扩展下:在linux shell当中的get方法: new=$(test:-another),当test有值的时候取前者,否则取后者.
v3
但现在看来,明显有更好的方法,直接调用collection的default_dict
func = lambda x: 0
d = default_dict(func)
for i in a_list:
d[i] += 1
这样做的好处是:
"This technique is simpler and faster than an equivalent technique using dict.setdefault()
:" ---from python文档
v4
那这样是不是最简洁的呢,不,
C = Counter(a_list)
一步到位
为毛还要你一直造轮子呢!
Ps:当你冥思苦想一直都找不出bug的时候,当你觉得自己实现了一个功能特别牛逼的时候,一定要沉下心来,默默念三遍
我就是个傻逼
我就是个傻逼
我就是个傻逼
然后,你会觉得,
你真的是个傻逼。
这个方法我已经用了几年了,屡试不爽……
============================我是分割线==========================================
v1
实现一个字典,这个字典是另外两个字典的并集,
以前的我是肯定是先copy,然后再update,
但是好像不太直观,可读性要差一点
V2
.items()加起来,然后dict一下
dict(a.iteriterms()+b.iteriterms())
v3
上面的方法会在py3中报错,
所以为什么不试试
Z = {星号x,星号y}
呢
一步到位,而且pythonic
当然,也可以用字典推倒式
但是我是一直不推荐用字典推倒式的,因为效率太慢,不信timeit一下