阅读 110

collections模块之defaultdict

1 单值映射字典中的使用

1.1 初始化时的情形

初始化之前先来看一看普通字典的情形

一般的dict会导致KeyError异常

count = {}
count['apple']
count['cherry']
print(count)复制代码

result:

Traceback (most recent call last):
  File "D:/interview/interview/22.py", line 2, in <module>
    count['apple']
KeyError: 'apple'复制代码

1.1.1 类型名称作为初始化时的参数

from collections import defaultdict

count = defaultdict(int)
count['apple']
count['cherry']
print(count)复制代码

result:

defaultdict(<class 'int'>, {'apple': 0, 'cherry': 0})复制代码

1.1.2 可调用函数作为初始化时的参数

def zero():
    return 0


count = defaultdict(zero)
count['apple']
count['cherry']
print(count)复制代码

result:

defaultdict(<function zero at 0x0000020D4DE55048>, {'apple': 0, 'cherry': 0})复制代码

1.2 更新时的情形

继承字典的所有方法,默认字典在初始化时必须指定字典的默认值

from collections import defaultdict

dic = defaultdict(dict)
dic["k1"].update({"asdsa":"123"})
print(dic)复制代码

result:

defaultdict(<class 'dict'>, {'k1': {'asdsa': '123'}})复制代码

字典dic在定义的时候就已经定义了值为字典类型,所以即使字典中没有k1这个键,仍然可以执行字典的update方法。这种操作方式在普通的字典中会报错

2 多值映射字典的情形

一般而言,字典就是一个键对应一个单值的映射,如果想要一个键映射多个值,可以将多个值放到容器中。

2.1 初始化时的情形

2.1.1 普通字典的操作

dict1 = {
    'a': [1, 2, 3],
    'b': [4, 5]
}
dict2 = {
    'a': {1, 2, 3},
    'b': {4, 5}
}复制代码

至于具体使用列表还是集合取决于实际需要。如果想要保持元素的插入顺序那就使用列表,反之则使用集合即可。

2.1.2 使用默认字典的操作

from collections import defaultdict

dict1 = defaultdict(list)
dict1['a'].append(1)
dict1['a'].extend([2, 3])
dict1['b'].extend([4, 5])

dict2 = defaultdict(set)
dict2['a'].add(1)
dict2['a'].update([2, 3])
dict2['b'].update([4, 5])
print(f'dict1===={dict1}')
print(f'dict2===={dict2}')复制代码

result:

dict1====defaultdict(<class 'list'>, {'a': [1, 2, 3], 'b': [4, 5]})
dict2====defaultdict(<class 'set'>, {'a': {1, 2, 3}, 'b': {4, 5}})复制代码

使用defaultdict需要注意的一点,defaultdict会为不存在的键也创建映射实体(其实就是值)。如果你不需要这个特性,可以在普通字典上使用setdefault()方法进行替代

2.1.3 使用setdefault()方法进行替代defaultdict

dict1 = {}
dict1.setdefault('a', []).append(1)
dict1.setdefault('a', []).extend([2, 3])
dict1.setdefault('b', []).extend([4, 5])
print(f'dict1===={dict1}')复制代码

result:

dict1===={'a': [1, 2, 3], 'b': [4, 5]}复制代码

2.2 更新时的情形

2.2.1 普通字典的操作

一般来讲,创建一个多值映射字典是很简单的。但是选择自己实现的话则在进行值的初始化的时候会显得有点麻烦

d = {}
pairs = [('banana', 3), ('apple', 4), ('pear', 1), ('orange', 2), ('banana', 4), ('pear', -1),]
for key, value in pairs:
    if key not in d:
        d[key] = []
    d[key].append(value)
print(d)复制代码

result:

{'banana': [3, 4], 'apple': [4], 'pear': [1, -1], 'orange': [2]}复制代码

2.2.2 默认字典的操作

from collections import defaultdict

d = defaultdict(list)
pairs = [('banana', 3), ('apple', 4), ('pear', 1), ('orange', 2), ('banana', 4), ('pear', -1),]
for key, value in pairs:
    d[key].append(value)
print(d)复制代码

result:

defaultdict(<class 'list'>, {'banana': [3, 4], 'apple': [4], 'pear': [1, -1], 'orange': [2]})复制代码

可以看到,使用defaultdict会使得代码更加简洁


作者:不思量自难忘
链接:https://juejin.cn/post/7019524508566585358


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐