python--字典初始化

来源:互联网 发布:java注释快捷键 编辑:程序博客网 时间:2024/05/03 14:59

如果说deque是加强版的list的话,那加强版的字典又是什么的呢?没错,就是今天学习的defaultdict,它与deque一样,都是在collections库中的模块。

先来看这样一个问题:

s = [('Tom', 5), ('Jone', 2), ('Susan', 4), ('Tom', 4), ('Tom', 1)]
对于这样一个元组列表,如果我们想要将它转化为字典,该如何操作呢?我们很容易想到这样的操作:

d={}s = [('Tom', 5), ('Jone', 2), ('Susan', 4), ('Tom', 4), ('Tom', 1)]for i,j in s:    d[i]=j

print一下,结果是什么呢?

{'Susan': 4, 'Jone': 2, 'Tom': 1}

这并不是我们期待的结果。在这个例子中,字典中‘Tom’键对应了三个值,我们希望这三个值以列表得形式储存。可以对代码进行一些修改:

k={}s = [('Tom', 5), ('Jone', 2), ('Susan', 4), ('Tom', 4), ('Tom', 1)]for i,j in s:    if i not in k.keys():#注意不能写成 if not k[i],因为其返回值不是None,而是error        l=[]        l.append(j)        k[i]=l    else:        k[i].append(j)print(k)
结果如下:

{'Susan': [4], 'Jone': [2], 'Tom': [5, 4, 1]}

当然,更加pythonic的写法是下面这样,这需要用到我们今天学习的defaultdict。

from collections import defaultdictd=defaultdict(list)s = [('Tom', 5), ('Jone', 2), ('Susan', 4), ('Tom', 4), ('Tom', 1)]for i,j in s:    d[i].append(j)print(list(d.items()))

通过:

d=defaultdict(list)

我们创建了一个默认值为列表的字典,此时无论键是否存在,其返回值均是一个列表。

>>> d=defaultdict(list)>>> d[1][]

我们看到,此时键[1]不存在,但并没有抛出错误,而是返回一个空列表。

当然,我们也可以让默认值为set,int,etc。我们可以把之前实现的方法改动一下,将列表换为集合:

from collections import defaultdictd=defaultdict(set)s = [('Tom', 5), ('Jone', 2), ('Susan', 4), ('Tom', 4), ('Tom', 1)]for i,j in s:    d[i].add(j)print(list(d.items()))    
结果如下:
[('Susan', {4}), ('Jone', {2}), ('Tom', {1, 4, 5})]
如果默认值是int,键不存在时,返回值默认为0。

>>> d=defaultdict(int)>>> d[1]0>>> d[3]0













0 0
原创粉丝点击