字典对象的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 "<stdin>", line 1, in <module>

  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


转自:https://mp.weixin.qq.com/s?__biz=MzI5NDY1MjQzNA==&mid=2247485608&idx=2&sn=0b77d8e5124e6ce2a7336daad095fe52&chksm=ec5ed7d5db295ec3ad703e96e857c69ab24b630ebcbe6ae3f858a6e202551c3bead63de01637&mpshare=1&scene=23&srcid=0208kt7bRJCTdVuJYBfbwB8D#rd
目录
相关文章
|
3月前
|
存储 JSON 索引
一文让你彻底搞懂 Python 字典是怎么实现的
一文让你彻底搞懂 Python 字典是怎么实现的
56 13
|
3月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
7月前
|
Python
python函数用法(五)
python函数用法(五)
67 1
|
7月前
|
自然语言处理 Python
python函数用法(三)
python函数用法(三)
42 0
|
7月前
|
Python
python函数用法(二)
python函数用法(二)
35 0
|
7月前
|
Serverless 开发者 Python
python函数用法(一)
python函数用法(一)
47 0
|
7月前
|
Python
python函数用法(四)
python函数用法(四)
53 0
|
7月前
|
Serverless 数据库 索引
Python基础语法、内建数据结构列表、元组、字典、集合的讲解及应用(附源码 超详细必看)
Python基础语法、内建数据结构列表、元组、字典、集合的讲解及应用(附源码 超详细必看)
89 0
|
算法 Python
Python编程 字典创建
Python编程 字典创建
91 0
|
Python
python初学者指南:列表,元祖,字典,集合的使用场景对比及操作异同点分析
python初学者指南:列表,元祖,字典,集合的使用场景对比及操作异同点分析
224 0
python初学者指南:列表,元祖,字典,集合的使用场景对比及操作异同点分析