Python如何建立多个值和单个键的映射

 更新时间:2024年09月11日 08:52:46   作者:TakingCoding4Granted  
在Python中,常见的字典只能映射单个键到单个值,若需映射单个键到多值,可以通过将值存储于列表或集合中实现,使用列表可以保持元素插入顺序,而使用集合则可以去重,collections模块的defaultdict类简化了此类多值字典的创建过程

问题

你希望创建一个字典,该字典可以建立多个值和单个键之间的映射(即所谓的多值字典)。

解决方案

在 Python 中,基于普通的字典类 dict 创建的对象一般只可以存储一个键和一个值的映射。

如果你希望存储一个键和多个值之间的映射,你需要将多个值存储存储在另一个容器中,如:列表或集合。

例如,你可能会创建如下所示的字典:

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

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

究竟是使用列表还是集合来保存多个值取决于实际需求,即如果你希望保持元素的插入顺序,那么使用列表比较好;如果你希望去除重复元素且不在乎元素的插入顺序,则使用集合更佳。

实际上,下面将看到,通过代码的方式创建上述的字典还是比较麻烦的,需要考虑某个键是否已经在字典中,并据此做不同的处理。

对此,标准模块 collections 中的类 defaultdict 可以使得通过代码创建类似上述字典变得很容易,使用该类创建的对象中,一个显著的特点是,对于不存在的键,在第一次尝试按照键添加值时,该对象做好自动的做好值的初始化。

例如:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d
defaultdict(<class 'list'>, {})
>>> d['a']
[]
>>> d
defaultdict(<class 'list'>, {'a': []})

>>> d = defaultdict(list)
>>> d['a'].append(1)
>>> d['a'].append(2)
>>> d['b'].append(4)
>>> d
defaultdict(<class 'list'>, {'a': [1, 2], 'b': [4]})

>>> d = defaultdict(set)
>>> d['a'].add(1)
>>> d['a'].add(2)
>>> d['b'].add(4)
>>> d
defaultdict(<class 'set'>, {'a': {1, 2}, 'b': {4}})

讨论

如上所述,如果使用普通的字典类 dict 创建对象实现和上述 defaultdict 类创建对象类似的功能,那么对于某个键第一个值的初始化就会比较麻烦。

例如,使用 dict 的初始化可能如下:

>>> pairs
>>> [('a', 1), ('a', 2), ('a', 3), ('b', 4), ('b', 5)]
>>> d = {}
>>> for key, value in pairs:
...    if key not in d:
...        d[key] = []
...    d[key].append(value)
    
>>> d
{'a': [1, 2, 3], 'b': [4, 5]}

如果使用 defaultdict ,那么代码就会很简洁:

>>> d = defaultdict(list)
>>> for key, value in pairs:
...    d[key].append(value)
    
>d
defaultdict(<class 'list'>, {'b': [4, 5], 'a': [1, 2, 3]})

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • linux下安装python3和对应的pip环境教程详解

    linux下安装python3和对应的pip环境教程详解

    这篇文章主要介绍了linux下安装python3和对应的pip环境,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 如何利用pyinstaller打包Python程序为exe可执行文件

    如何利用pyinstaller打包Python程序为exe可执行文件

    这篇文章主要给大家介绍了关于如何利用pyinstaller打包Python程序为exe可执行文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python标准库之随机数 (math包、random包)介绍

    Python标准库之随机数 (math包、random包)介绍

    这篇文章主要介绍了Python标准库之随机数 (math包、random包)介绍,本文讲解了math包的常用函数,同时给出了random包的使用例子,需要的朋友可以参考下
    2014-11-11
  • python多线程互斥锁与死锁

    python多线程互斥锁与死锁

    这篇文章主要介绍了python多线程互斥锁与死锁,多线程间的资源竞争下文我们就以task1(),task2()两个函数为例,分别将对全局变量num加一重复一千万次循环,具有一定得参考价值,需要的小伙伴可以参考一下
    2022-02-02
  • OpenCV-Python实现油画效果的实例

    OpenCV-Python实现油画效果的实例

    OpenCV是功能强大的计算机视觉库,本文主要使用OpenCV来实现图片的油画效果,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • 使用Python协程实现支持断点续传的文件下载器

    使用Python协程实现支持断点续传的文件下载器

    协程是一种多方协同的工作方式,协程不是进程或线程,其执行过程类似于 Python 函数调用,协程是对使用 async 关键字定义的异步函数的调用,本文介绍了如何使用Python协程实现支持断点续传的文件下载器,需要的朋友可以参考下
    2025-09-09
  • Python 旋转打印各种矩形的方法

    Python 旋转打印各种矩形的方法

    今天小编就为大家分享一篇Python 旋转打印各种矩形的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python计算圆周率pi的方法

    python计算圆周率pi的方法

    这篇文章主要介绍了python计算圆周率pi的方法,涉及Python针对数学运算的相关技巧,需要的朋友可以参考下
    2015-07-07
  • python通过colorama模块在控制台输出彩色文字的方法

    python通过colorama模块在控制台输出彩色文字的方法

    这篇文章主要介绍了python通过colorama模块在控制台输出彩色文字的方法,实例分析了colorama模块的功能及相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Python 多维List创建的问题小结

    Python 多维List创建的问题小结

    这篇文章主要介绍了Python 多维List创建的问题小结,详细的介绍了遇到的一个小问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01

最新评论