Python字典:collections 中 defaultdict 的使用

news/2024/11/19 13:29:57/

1.字典的键映射多个值

将下面的列表转成字典

l = [('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]

一个字典就是一个键对应一个单值的映射,而上面的列表中有相同键。如果你想要一个键映射多个值,那么就需要将这多个值放到另外的序列中,比如 list 或者 set 里面,像下面这样:

1

2

3

4

5

6

7

8

d = {

    'a': [1, 2, 3],

    'b': [4, 5]

}

e = {

    'a': {1, 2, 3},

    'b': {4, 5}

}

你可以很方便的使用 collections 模块中的 defaultdict 来构造这样的字典。 defaultdict 的一个特征是它会自动初始化每个 key 刚开始对应的值。

1

2

3

4

5

6

7

8

In [1]: l = [('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]

In [2]: from collections import defaultdict

In [3]: d = defaultdict(list)

In [4]: for key, value in l:

   ...:     d[key].append(value)

   ...:

In [5]: d

Out[5]: defaultdict(list, {'a': [2, 1, 3, 1], 'b': [3, 4, 3]})

当然这个默认的容器不一定是 list, 也可以是集合 set。根据自己的需求选择用 list 还是 set 。如果你想保持元素的插入顺序就应该使用列表,如果想去掉重复元素就使用集合!

2.统计字典中某个值出现的次数

来源于微信交流群里一个朋友工作中的问题,列表中有很多字典,需要统计字典中相同的键对应的值的和

利用 defaultdict 设置默认值的方法 defaultdict(int),代码如下:

1

2

3

4

5

6

7

8

In [6]: d = defaultdict(int)

In [7]: objs = [{'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}]

In [8]: for obj in objs:

   ...:     for key,value in obj.items():

   ...:         d[key] += value

   ...:

In [9]: d

Out[9]: defaultdict(int, {'F29958SVDK6': 60})

二、collections 创建有序字典

字典dict是无序的,如果我们想要有序的dict,可以使用OrdereDict 。示例如下:

1

2

3

4

5

6

7

In [11]: from collections import OrderedDict

In [12]: d = OrderedDict()

In [13]: d['bar'] = 2

In [14]: d['non'] = 8

In [15]: d['sek'] = 5

In [16]: d

Out[17]: OrderedDict([('bar', 2), ('non', 8), ('sek', 5)])

OrderedDict 内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的元 素插入进来的时候,它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会 改变键的顺序。

需要注意的是,一个 OrderedDict 的大小是一个普通字典的两倍,因为它内部维 护着另外一个链表。所以如果你要构建一个需要大量 OrderedDict 实例的数据结构的 时候 (比如读取 100,000 行 CSV 数据到一个 OrderedDict 列表中去),那么你就得仔细权衡一下是否使用 OrderedDict 带来的好处要大过额外内存消耗的影响。

1.改变 key-value 的顺序

OrderedDict 是有序的字典,同时也能改变其顺序。比如我们想要改变有序的 OrderedDict 对象的 key-value 顺序,可以使用 move_to_end(key)。还是以上面创建的有序字典为例子

1

2

3

In [18]: d.move_to_end("bar")

In [20]: d

Out[20]: OrderedDict([('non', 8), ('sek', 5), ('bar', 2)])

可以看到之前排在第一位的 bar被移到最后一位了。move_to_end 还接收一个关键字参数 last。last 默认为 True,当 last = False 的时候,表示将该键移动到最前面!

2.删除 key_value

如果我们要删除有序字典中的 key-value, 可以使用 popitem 方法, popitem(last=True) 按照先进后出的顺序删除 dict中 的 key-value,popitem(last=False) 按照先进先出的规则删除 dict 中的 key-value。

1

2

3

4

5

6

In [42]: d

Out[42]: OrderedDict([('bar', 2), ('non', 8), ('sek', 5)])

In [43]: d.popitem(last=False)

Out[43]: ('bar', 2)

In [44]: d

Out[44]: OrderedDict([('non', 8), ('sek', 5)])

来源:https://www.weidianyuedu.com


http://www.ppmy.cn/news/5563.html

相关文章

三、二维实体类(AcGeEntity2d)

三、二维实体类(AcGeEntity2d) 3.1 AcGeEntity2d类方法 常规函数(用法同2.2节) 镜像:mirror 旋转:rotateBy 等比缩放:scaleBy 矩阵操作:transformBy 平移:translateBy(const AcGeVector2d&…

Practise test day9

另类加法_牛客网 解题思路:位运算符 1 0001 2 0010 按位与&:如果两个二进制位都为1,则返回1,否则返回0 按位异或:两个二进制位相同返回0,不同返回1。 1.二进制位异或的结果,是两个数对应相加…

Java高效率复习-MyBatis[MyBatis]

前言 ORM是持久化映射框架&#xff0c;但是MyBatis的本质并不是ORM框架。 如何使用MyBatis执行数据库语句 依赖导入 首先如果是Maven工程&#xff0c;则导入JDBC的依赖以及MyBaits的核心依赖。 <packaging>jar</packaging> <dependencies><dependenc…

[ 常用工具篇 ] 使用 kali 实现网络钓鱼 -- setoolkit 详解实战(一)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Simple Yet Effective Graph Contrastive Learning for Recommendation

1. 摘要 图神经网络(GNN)是一种强大的基于图的推荐系统学习方法。最近&#xff0c;结合对比学习的gnn在处理高度稀疏数据时&#xff0c;在数据增强方案的推荐方面表现出了优异的性能。尽管它们取得了成功&#xff0c;但大多数现有的图对比学习方法要么在用户-项目交互图上执行随…

健康指标管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;公告类型、公告信息、地区信息、用户信息、人员分类、人员信息、指标信息、健康信息 管理员功能&a…

我国融资性担保行业整体呈减量提质趋势 国家“出手”解决行业痛点

根据观研报告网发布的《中国融资性担保行业发展趋势分析与投资前景预测报告&#xff08;2022-2029年&#xff09;》显示&#xff0c;融资性担保行业是指担保人与银行业金融机构等债权人约定&#xff0c;当被担保人不履行对债权人负有的融资性债务时&#xff0c;由担保人依法承担…

微信键盘能否解锁 App “小而美”的时代?

在移动互联网时代&#xff0c;输入法作为底层的基础性工具&#xff0c;发挥着至关重要的作用。“优秀”的键盘能带来高效的分享体验&#xff0c;既能让聊天更加流畅&#xff0c;也能增添工作和生活中的趣味和惊喜。 今天&#xff08; 12 月 19 &#xff09;&#xff0c;“微信…