字典中的键映射多个值

问题

怎样实现一个键对应多个值的字典 (也叫 multidict )?

解法

一个字典就是一个键对应一个单值的映射。如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中,比如列表或者集合里面。比如,你可以像下面这样构造这样的字典:

d = {'a' : [1, 2, 3],'b' : [4, 5]
}e = {'a' : {1, 2, 3},'b' : {4, 5}
}

选择使用列表还是集合取决于你的实际需求。如果你想保持元素的插入顺序就应该使用列表,如果想去掉重复元素并且不关心元素的顺序问题,就使用集合。

你可以很方便的使用 collections 模块中的 defaultdict 来构造这样的字典。defaultdict 的一个特征是它会自动初始化每个 key 刚开始对应的值,所以你只需要关注添加元素操作了。比如:

from collections import defaultdictd = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)d = defaultdict(set)
d['a'].add(1)
d['a'].add(2)
d['b'].add(4)

需要注意的是, defaultdict 会自动为将要访问的键 (就算目前字典中并不存在这样的键) 创建映射实体。如果你并不需要这样的特性,你可以在一个普通的字典上使用setdefault() 方法来代替。比如:

d = {} # A regular dictionary
d.setdefault('a', []).append(1)
d.setdefault('a', []).append(2)
d.setdefault('b', []).append(4)

但是很多程序员觉得 setdefault() 用起来有点别扭。因为每次调用都得创建一个新的初始值的实例 (例子程序中的空列表[])。

讨论

一般来讲,创建一个多值映射字典是很简单的。但是,如果你选择自己实现的话,那么对于值的初始化可能会有点麻烦,你可能会像下面这样来实现:

d = {}
for key, value in pairs:if key not in d:d[key] = []d[key].append(value)

如果使用 defaultdict 的话代码就更加简洁了:

d = defaultdict(list)
for key, value in pairs:d[key].append(value)

《Python Cookbook 3rd》笔记(1.6):字典中的键映射多个值相关推荐

  1. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  2. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

  3. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  4. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  5. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  6. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  7. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  8. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  9. python中字典的键是唯一的吗_在python3中反转字典中的键和值(值不唯一)

    我知道当值是唯一的时,如何简单地在字典中反转键和值. 但是当值不唯一时如何反转. 根据要求,如果值出现不止一次,我需要使用set来将它们组合在一起. 防爆.输入d = {'a':1,'b':2,'c' ...

最新文章

  1. vijos 1476 旅游规划题解
  2. xcode打包(Archive)显示Command /usr/bin/codesign failed
  3. GNU ARM汇编--(二)汇编编译链接与运行
  4. Adobe宣布不再针对iPhone开发Flash工具
  5. 数据结构和算法分析:第三章 表、队列和栈
  6. php赋值权重_php权重计算方法代码分享
  7. Visual Studio的调试技巧
  8. 最大功率点跟踪_ADI公司推出集成最大功率点跟踪和I2C的80V降压升压电池充电控制器...
  9. Stack Overflow 2021开发者调查报告 - 数据库篇!
  10. 选择排序:简单选择排序
  11. 米斯特白帽培训讲义(v2)信息收集
  12. 谷歌 AI 中国中心彻底变天了!
  13. 20191126_1_电影票房分析
  14. office新建文件打开提示文件格式或扩展名无效
  15. 我们到底在恐惧什么?
  16. android视频动态壁纸app,短视频动态壁纸转换
  17. plotly绘制简单图形10--金字塔图
  18. barcode4j CODE128/EAN128生成 不定长 msg值 分隔符
  19. 盘点适合入门学习的C/C++开源项目
  20. 服务器主板显示ff,主板诊断卡代码显示ff的维修方法

热门文章

  1. S3C6410启动模式介绍
  2. linux将文件下载到本地windows,XSHELL下直接下载文件到本地(Windows)
  3. 职场上个人的核心技术_职场上,这3种人表面老实,实际却是个“高手”,要远离...
  4. python词频统计代码_机器学习必备宝典-《统计学习方法》的python代码实现及课件...
  5. 外架小横杆外露长度规范要求_安全文明施工规范
  6. C语言程序设计(代码+知识点)
  7. 【转】C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁
  8. 【转】C#实现SM3国密加密
  9. IIS/ASP.NET 管道
  10. 软件测试计划时要记住什么