Weibw's World Weibw's World
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Weibw

一个没有梦想的咸鱼
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《Flask》

  • 《Python Cookbook》第三版

    • 第一章:数据结构与算法

      • 解压序列赋值给多个变量
      • 解压可迭代对象赋值给多个变量
      • 保留最后 N 个元素
      • 查找最大或最小的 N 个元素
      • 实现一个优先级队列
      • 字典中的键映射多个值
      • 字典排序
      • 字典的运算
      • 查找两字典的相同点
      • 删除序列相同元素并保持顺序
      • 命名切片
      • 序列中出现次数最多的元素
      • 通过某个关键字排序一个字典列表
      • 排序不支持原生比较的对象
      • 通过某个字段将记录分组
      • 过滤序列元素
      • 从字典中提取子集
      • 映射名称到序列元素
      • 转换并同时计算数据
      • 合并多个字典或映射
      • 第二章:字符串和文本

      • 第三章:数字日期和时间

      • 第四章:迭代器与生成器

      • 第五章:文件与IO

      • 第六章:数据编码和处理

      • 第七章:函数

      • 第八章:类与对象

      • 第九章:元编程

      • 第十章:模块与包

      • 第十一章:网络与Web编程

      • 第十二章:并发编程

      • 第十三章:脚本编程与系统管理

      • 第十四章:测试、调试和异常

      • 第十五章:C语言扩展

    • Python基础

    • Python
    • 《Python Cookbook》第三版
    • 第一章:数据结构与算法
    weibw
    2021-12-21

    合并多个字典或映射

    # 问题

    现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某 些操作,比如查找值或者检查某些键是否存在。

    # 解决方案

    假如你有如下两个字典:

    a = {'x': 1, 'z': 3 }
    b = {'y': 2, 'z': 4 }
    
    1
    2

    现在假设你必须在两个字典中执行查找操作(比如先从 a 中找,如果找不到再在 b 中找)。一个非常简单的解决方案就是使用 collections 模块中的 ChainMap 类。比如:

    from collections import ChainMap
    c = ChainMap(a,b)
    print(c['x']) # Outputs 1 (from a)
    print(c['y']) # Outputs 2 (from b)
    print(c['z']) # Outputs 3 (from a)
    
    1
    2
    3
    4
    5

    # 讨论

    一个 ChainMap 接受多个字典并将它们在逻辑上变为一个字典。然后,这些字典并 不是真的合并在一起了,ChainMap 类只是在内部创建了一个容纳这些字典的列表并重 新定义了一些常见的字典操作来遍历这个列表。大部分字典操作都是可以正常使用的, 比如:

    >>> len(c)
    3
    >>> list(c.keys())
    ['x', 'y', 'z']
    >>> list(c.values())
    [1, 2, 3]
    >>>
    
    1
    2
    3
    4
    5
    6
    7

    如果出现重复键,那么第一次出现的映射值会被返回。因此,例子程序中的 c['z'] 总是会返回字典 a 中对应的值,而不是 b 中对应的值。 对于字典的更新或删除操作总是影响的是列表中第一个字典。比如:

    >>> c['z'] = 10
    >>> c['w'] = 40
    >>> del c['x']
    >>> a
    {'w': 40, 'z': 10}
    >>> del c['y']
    Traceback (most recent call last):
    ...
    KeyError: "Key not found in the first mapping: 'y'"
    >>>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    ChainMap 对于编程语言中的作用范围变量(比如 globals , locals 等)是非常有 用的。事实上,有一些方法可以使它变得简单:

    >>> values = ChainMap()
    >>> values['x'] = 1
    >>> # Add a new mapping
    >>> values = values.new_child()
    >>> values['x'] = 2
    >>> # Add a new mapping
    >>> values = values.new_child()
    >>> values['x'] = 3
    >>> values
    ChainMap({'x': 3}, {'x': 2}, {'x': 1})
    >>> values['x']
    3
    >>> # Discard last mapping
    >>> values = values.parents
    >>> values['x']
    2
    >>> # Discard last mapping
    >>> values = values.parents
    >>> values['x']
    1
    >>> values
    ChainMap({'x': 1})
    >>>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    作为 ChainMap 的替代,你可能会考虑使用 update() 方法将两个字典合并。比如:

    >>> a = {'x': 1, 'z': 3 }
    >>> b = {'y': 2, 'z': 4 }
    >>> merged = dict(b)
    >>> merged.update(a)
    >>> merged['x']
    1
    >>> merged['y']
    2
    >>> merged['z']
    3
    >>>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    这样也能行得通,但是它需要你创建一个完全不同的字典对象(或者是破坏现有 字典结构)。同时,如果原字典做了更新,这种改变不会反应到新的合并字典中去。比 如:

    >>> a['x'] = 13
    >>> merged['x']
    1
    
    1
    2
    3

    ChainMap 使用原来的字典,它自己不创建新的字典。所以它并不会产生上面所说 的结果,比如:

    >>> a = {'x': 1, 'z': 3 }
    >>> b = {'y': 2, 'z': 4 }
    >>> merged = ChainMap(a, b)
    >>> merged['x']
    1
    >>> a['x'] = 42
    >>> merged['x'] # Notice change to merged dicts
    42
    >>>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    编辑 (opens new window)
    #Python
    上次更新: 2023/10/13, 17:39:25
    转换并同时计算数据
    使用多个界定符分割字符串

    ← 转换并同时计算数据 使用多个界定符分割字符串→

    最近更新
    01
    牛客网非技术快速入门SQL练习题
    03-08
    02
    其他日常SQL题
    03-07
    03
    用户与权限管理
    03-05
    更多文章>
    Theme by Vdoing | Copyright © 2021-2023 | Weibw | 辽ICP备18015889号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式