如何快速合并两个字典

现在有两个字典:

x = {'a':1,'b':2}y = {'b':10,'c':11}

如何将这两个字典合并成一个新的字典z,有看过我之前写的文章可能会知道使用,一个接受多个字典并将它们在逻辑上变为一个字典。为什么说在逻辑上?因为类只是在内部创建了一个容纳这些字典的列表,并重新定义了一些常见的字典操作来遍历这个列表,并没有真正的创建字典。

fromcollectionsimportChainMapz = ChainMap(x, y)print(z)

# 字典的常用操作不变

print(list(z.values()))print(list(z.keys()))

ChainMap({‘a’: 20, ‘b’: 2}, {‘b’: 10, ‘c’: 11})

[11, 20, 2]

[‘c’, ‘a’, ‘b’]

如果字典中有相同的键,默认使用第一个字典中的键值,比如上面的x和y中都有键,那么z中的键b的值为2。

print(z['b'])

2

如果我们更新z中的键值,会发生什么。

z['a'] =20

print(x)

{‘a’: 20, ‘b’: 2}

可以看到,改变z中键的值,合并前字典中的值也会改变。反过来亦可以。

除了上面说的ChainMap方法外,有没有其他更简便的方法?或者我希望当两个字典中的键一样时,默认使用第二个字典中的值呢?

如果使用的python版本是3.5以上的话,有一个很简便的方法合并两个字典:

z = {**x, **y}print(z)

{‘a’: 20, ‘b’: 10, ‘c’: 11}

amazing!

如果你的python版本低于3.5呢,或是项目中使用的是更低版本的python,怎么做。

defmerge_two_dicts(x, y):

# 做一份潜复制

z = x.copy()

# 更新z中的键值

z.update(y)

returnzz = merge_two_dicts(x, y)print(z)

{‘a’: 20, ‘b’: 10, ‘c’: 11}

在上面的函数中,使用update方法将两个字典合并。当然了,如果要合并多个字典也是可以的,把原来的代码大概修改一下:

defmerge_dicts(*dict_args):

result = {}

fordictionaryindict_args: result.update(dictionary)

returnresult

使用可变参数传入多个字典。

不过,需要注意的是,除了ChainMap方法外,另外两种方法在字典中的键相同时,默认使用最后一个字典中的值,而且改变原来字典的键值不会影响到合并之后的结果,反之亦然。因为这两种操作都是生成了一个新的字典类型。

x = {'a':1,'b':2}y = {'b':10,'c':11}z = merge_dicts(x, y)print(z)x['a'] =20print(x)print(z)z_ = {**x, **y}print(z_)x['a'] =30print(z_)

{‘a’: 1, ‘b’: 10, ‘c’: 11}

{‘a’: 20, ‘b’: 2}

{‘a’: 1, ‘b’: 10, ‘c’: 11}

{‘a’: 20, ‘b’: 10, ‘c’: 11}

{‘a’: 20, ‘b’: 10, ‘c’: 11}

有什么问题,可以在下面留言哈。

本文来自企鹅号 - 码上就来媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蜕变

Python 数据类型

Python主要数据类型包括list(列表)、tuple(元组)、dict(字典)和set(集合)等对象,下面逐一介绍这些Python数据类型。

9500
来自专栏aCloudDeveloper

C++中引用详解

引用简介   引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。   引用的声明方法:类型标识符 &引用名=目标变量名;   【...

19650
来自专栏猿人谷

Java初学者需掌握的30个概念

基本概念:       1.OOP中唯一关心的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道c...

182100
来自专栏梧雨北辰的开发录

Swift学习:构造器(下)

本篇主要介绍Swift中构造器的一些特殊用法 一、可失败的构造器 顾名思义,这是用于我们构造过程可能失败情况的构造器。失败的原因可能是给构造器传入无效的参数值,...

28570
来自专栏抠抠空间

集合 (set) 的增删改查及 copy()方法

简介: 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点: 1、...

321110
来自专栏C/C++基础

CC++变参函数

C语言中,有时需要变参函数来完成特殊的功能,比如C标准库函数printf()和scanf()。C中提供了省略符“…”能够帮主programmer完成变参函数的书...

9810
来自专栏用户2442861的专栏

Java基础之String中equals,声明方式,等大总结

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/49420141 

9320
来自专栏程序生活

Python itertools的使用简介无限迭代器chain方法

用*放在一个可迭代对象前面可以将对象拆分成多个单元素,比如first=[['1','2','3','4','4'],['2','4','2']],如果把*放在f...

8310
来自专栏全沾开发(huā)

搞懂JavaScript中的连续赋值

搞懂JavaScript中的连续赋值 前段时间老是被一道题刷屏,一个关于连续赋值的坑。 遂留下一个笔记,以后再碰到有人问这个题,直接...

42660
来自专栏从零开始学 Web 前端

01 - JavaSE之基础及面向对象

byte(-128 ~ 127) short(-32768 ~ 32767) int(-2147483648 ~ 2147483647)

18140

扫码关注云+社区

领取腾讯云代金券