字典对象的pythonic用法:下篇

字典对象在Python中作为最常用的数据结构之一,和数字、字符串、列表、元组并列为5大基本数据结构,如果把列表看作是有序集合,那么字典就是无序的集合,字典中的元素通过键来存取,而非像列表一样通过偏移存取。笔者总结了字典的一些常用Pyhonic用法,这是python字典的pythonic用法的下篇

4. 高效合并字典

普通方法

合并多个字典的时候可以用一行代码实现:

x = {'a': 1, 'b': 2}	
y = {'b': 3, 'c': 4}	
z = dict(x.items() + y.items())

这种写法看起来很Pythonic,但仔细分析的话,它的执行效率并不高, items()方法在python2.7中返回的是列表对象,两个列表相加得到一个新的列表,这样内存中存在3个列表对象,如果两个列表的大小都是1G,那么执行这段代码需要占用4G的空间来创建这个字典。此外这段代码在Python3中会报错,因为python3中 items()返回的是 dict_items对象,而不是列表。

>>> c = dict(a.items() + b.items())	
Traceback (most recent call last):	
  File "<stdin>", line 1, in <module>	
TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'

在python3中,你需要明确地强制转换成list对象:

z = dict(list(x.items()) + list(y.items()))

Pythonic方法

在Python3.5中提供了一种全新的Pythonic方法:

z = {**x, **y}

不过考虑到大部分系统还是基于Python2,所以一种更兼容的pythonic方法是:

z = x.copy()	
z.update(y) 

当然,你可以把它封装成一个函数:

def merge_dicts(*dict_args):	
    '''	
   可以接收1个或多个字典参数	
    '''	
    result = {}	
    for dictionary in dict_args:	
        result.update(dictionary)	
    return result	
	
z = merge_dicts(a, b, c, d, e, f, g) 

其他方法

还有其他方式来合并字典,但是性能不一定是最优的,比如: python2.7可以支持字典推导式

{k: v for d in dicts for k, v in d.items()} 

python2.6及以下版本使用

dict((k, v) for d in dicts for k, v in d.items())

性能对比

import timeit	
>>> min(timeit.repeat(lambda: {**x, **y}))  # python3.5	
0.4094954460160807	
>>> min(timeit.repeat(lambda: merge_two_dicts(x, y)))	
0.5726828575134277	
>>> min(timeit.repeat(lambda: {k: v for d in (x, y) for k, v in d.items()} ))	
1.163769006729126	
>>> min(timeit.repeat(lambda: dict((k, v) for d in (x, y) for k, v in d.items())))	
2.2345519065856934

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值