python--字典初始化

原文链接: https://blog.csdn.net/spynao/article/details/50176761

如果说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 defaultdict
d=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 defaultdict
d=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

 

你可能感兴趣的:(python--字典初始化)