社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

字典对象的pythonic用法:下篇

Python爱好者社区 • 7 年前 • 690 次点击  

作者:刘志军,6年+Python使用经验, 高级开发工程师,目前在互联网医疗行业从事Web系统构架工作

个人公众号:Python之禅(微信ID:vttalk)


前文传送门:字典对象的Pythonic用法:上篇


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

4. 高效合并字典

普通方法

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

  1. x = {'a': 1, 'b': 2}

  2. y = {'b': 3, 'c': 4}

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

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

  1. >>> c = dict(a.items() + b.items())

  2. Traceback (most recent call last):

  3.  File "", line 1, in

  4. TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'

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

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

Pythonic方法

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

  1. z = {**x, **y}

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

  1. z = x.copy()

  2. z.update(y)

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

  1. def merge_dicts(*dict_args):

  2.    '''

  3.   可以接收1个或多个字典参数

  4.    '''

  5.    result = {}

  6.    for dictionary in dict_args:

  7.        result.update(dictionary)

  8.    return result


  9. z = merge_dicts(a, b, c, d, e, f, g)

其他方法

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

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

python2.6及以下版本使用

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

性能对比

  1. import timeit

  2. >>> min(timeit.repeat(lambda: {**x, **y}))  # python3.5

  3. 0.4094954460160807

  4. >>> min(timeit.repeat(lambda: merge_two_dicts(x, y)))

  5. 0.5726828575134277

  6. >>> min(timeit.repeat(lambda: {k: v for d in (x, y) for k, v in d.items()} ))

  7. 1.163769006729126

  8. >>> min(timeit.repeat(lambda: dict((k, v) for d in (x, y) for k, v in d.items())))

  9. 2.2345519065856934



Python爱好者社区福利大放送!!!

扫码或者点击阅读原文,领取福利

扫码或者点击阅读原文,领取福利


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/go82vsl4Kw
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/7093
 
690 次点击