字典对象的Pythonic用法:上篇

简介:

字典对象在Python中作为最常用的数据结构之一,和数字、字符串、列表、元组并列为5大基本数据结构,字典中的元素通过键来存取,而非像列表一样通过偏移存取。笔者总结了字典的一些常用Pyhonic用法,这是字典的Pythonic用法的上篇

0. 使用 in/not in 检查 key 是否存在于字典

判断某个 key 是否存在于字典中时,一般初学者想到的方法是,先以列表的形式把字典所有键返回,再判断该key是否存在于键列表中:

 
  1.    dictionary = {}

  2.    keys = dictionary.keys()

  3.    for k in keys:

  4.        if key == k:

  5.            print True

  6.            break

更具Pythonic的用法是使用 in关键字来判断 key 是否 存在于字典中:

 
  1.    if key in dictionary:

  2.        print True

  3.    else:

  4.        print False

1. 使用 setdefault() 初始化字典键值

使用字典的时候经常会遇到这样一种应用场景:动态更新字典,像如下代码,如果 key 不在 dictionary 中那么就添加它并把它对应的值初始为空列表 [] ,然后把元素 append 到空列表中:

 
  1. dictionary = {}

  2. if "key" not in dictionary:

  3.    dictionary["key"] = []

  4. dictionary["key"].append("list_item")

尽管这段代码没有任何逻辑错误,但是我们可以使用 setdefault来实现更Pyhonic的写法:

 
  1. dictionary = {}

  2. dictionary.setdefault("key", []).append("list_item")

字典调用 setdefault 方法时,首先检查 key 是否存在,如果存在该方法什么也不做,如果不存在 setdefault 就会创建该 key,并把第二个参数 []作为 key 对应的值。

2. 使用 defaultdict() 初始化字典

初始化一个字典时,如果初始情况下希望所有 key 对应的值都是某个默认的初始值,比如有一批用户的信用积分都初始为100,现在想给 a 用户增加10分

 
  1. d = {}

  2. if 'a' not in d:

  3.    d['a'] = 100

  4. d['a'] += 10

同样这段代码也没任何问题,换成更pyhtonic的写法是:

 
  1. from collections import defaultdict

  2. d = defaultdict(lambda: 100)

  3. d['a'] += 10

defaultdict 是位于 collections 模块下,它是 dict 类的子类,语法结构是:

 
  1. class collections.defaultdict([default_factory[, ...]])

第一个参数 default_factory是一个工厂方法,每次初始化某个键的时候将会被调用,value就是 default_factory返回的值,剩下的参数和 dict()函数接收的参数一样

3. 使用 iteritems() 迭代大数据

迭代大数据字典时,如果是使用 items() 方法,那么在迭代之前,迭代器迭代前需要把数据完整地加载到内存,这种方式不仅处理非常慢而且浪费内存,下面代码约占1.6G内存(为什么是1.6G?可以参考:http://stackoverflow.com/questions/4279358/pythons-underlying-hash-data-structure-for-dictionaries

 
  1. d = {i: i * 2 for i in xrange(10000000)}

  2. for key, value in d.items():

  3.    print("{0} = {1}".format(key, value))

而使用 iteritem() 方法替换 items() ,最终实现的效果一样,但是消耗的内存降低50%,为什么差距那么大呢?因为 items() 返回的是一个 list,list 在迭代的时候会预先把所有的元素加载到内存,而 iteritem() 返回的一个迭代器(iterators),迭代器在迭代的时候,迭代元素逐个的生成。

 
  1. d = {i: i * 2 for i in xrange(10000000)}

  2. for key, value in d.iteritem():

  3.    print("{0} = {1}".format(key, value))



转自:https://mp.weixin.qq.com/s?__biz=MzI5NDY1MjQzNA==&mid=2247485582&idx=2&sn=701d78855d60af619acbbaeeef40e9e1&chksm=ec5ed7f3db295ee5d2bb69fbecb12818e21330203d259cbdb156adb5aa6a4ed2d4f6033d3674&scene=21#wechat_redirect
目录
相关文章
|
5月前
|
Python 缓存
Python ChainMap:链式映射的妙用与实战解析
【4月更文挑战第1天】Python中的`collections`模块提供了一个名为`ChainMap`的类,它实现了多个字典的链式查找。`ChainMap`将多个字典组织成一个逻辑上的单一字典,允许你像操作单个字典一样来访问这些字典。当在`ChainMap`中查找一个键时,它会按照字典被添加的顺序从前向后依次查找,直到找到匹配的键为止。如果找不到,就会抛出`KeyError`。
|
5月前
|
存储 Python
一文掌握python数组字典dict()的全部用法(零基础学python(三))
一文掌握python数组字典dict()的全部用法(零基础学python(三))
|
5天前
|
存储 JSON 索引
一文让你彻底搞懂 Python 字典是怎么实现的
一文让你彻底搞懂 Python 字典是怎么实现的
29 13
|
5月前
|
Python
python函数用法(五)
python函数用法(五)
59 1
|
5月前
|
Python
python函数用法(二)
python函数用法(二)
28 0
|
5月前
|
Python
python函数用法(四)
python函数用法(四)
45 0
|
5月前
|
Serverless 开发者 Python
python函数用法(一)
python函数用法(一)
32 0
|
5月前
|
自然语言处理 Python
python函数用法(三)
python函数用法(三)
37 0
|
5月前
|
Serverless 数据库 索引
Python基础语法、内建数据结构列表、元组、字典、集合的讲解及应用(附源码 超详细必看)
Python基础语法、内建数据结构列表、元组、字典、集合的讲解及应用(附源码 超详细必看)
80 0
|
算法 Python
Python编程 字典创建
Python编程 字典创建
85 0
下一篇
无影云桌面