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]})

总结

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

相关文章

  • python实现狄克斯特拉算法

    python实现狄克斯特拉算法

    这篇文章主要为大家详细介绍了python实现狄克斯特拉算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Python中的 No Module named ***问题及解决

    Python中的 No Module named ***问题及解决

    这篇文章主要介绍了Python中的 No Module named ***问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python数据持久化存储实现方法分析

    Python数据持久化存储实现方法分析

    这篇文章主要介绍了Python数据持久化存储实现方法,结合实例形式分析了Python基于pymongo及mysql模块的数据持久化存储操作相关实现技巧,需要的朋友可以参考下
    2019-12-12
  • Python字符串常规操作小结

    Python字符串常规操作小结

    本文主要介绍了Python字符串常规操作小结,如拼接字符串、截取字符串、格式化字符串等,下面将对Python中常用字符串操作方法进行介绍,感兴趣的可以了解一下
    2022-04-04
  • python中下标和切片的使用方法解析

    python中下标和切片的使用方法解析

    这篇文章主要介绍了python中下标和切片的使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python pandera数据验证和清洗的库

    Python pandera数据验证和清洗的库

    为了确保数据的质量,Python Pandera 库应运而生。本文将深入介绍 Python Pandera,这是一个用于数据验证和清洗的库,并提供丰富的示例代码,帮助大家充分利用它来提高数据质量
    2024-01-01
  • 最基础的Python的socket编程入门教程

    最基础的Python的socket编程入门教程

    这篇文章主要介绍了最基础的Python的socket编程入门教程,包括最基本的发送和接受信息等内容,需要的朋友可以参考下
    2015-04-04
  • 关于Python元祖,列表,字典,集合的比较

    关于Python元祖,列表,字典,集合的比较

    下面小编就为大家带来一篇关于Python元祖,列表,字典,集合的比较。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 学python最电脑配置有要求么

    学python最电脑配置有要求么

    在本篇内容中小编给大家整理的是关于学习python中电脑配置的相关文章,需要的朋友们可以学习下。
    2020-07-07
  • python列表与列表算法详解

    python列表与列表算法详解

    这篇文章主要介绍了Python的列表和列表算法,具有一定参考价值,需要的朋友可以了解下,希望能给你带来帮助
    2021-08-08

最新评论