本文Python版本为3.7.X,阅读本文之前需了解python字典的基本用法。

介绍

字典(dict)是Python中内置的一个数据结构,由多个键值对组成,键(key)和值(value)用冒号分隔,每个键值对之间用逗号(,)分隔,整个字典包括在大括号中({}),键必须是唯一的,值可以取任何类型,但是键必须是不可变类型,如字符串,数字或元组。

底层使用了hash表来关联key和value,dict是无序的。特点包括:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用的内存较多

所以,dict是一种以空间换取时间的数据结构,应用于需要快速查找的场景。

操作

常用方法

get()

返回指定键的值,如果key不存在,则返回默认值(默认为None),而不会报错,语法为dict.get(key)。

dict_1['age'] = 24

In [7]: print(dict_1.get('age'))
24 In [11]: print(dict_1.get('nama'))
None In [12]: print(dict_1['nama'])
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-12-ef61a380920e> in <module>
----> 1 print(dict_1['nama']) KeyError: 'nama'

key in dict

使用in操作符来判断键是否存在于字典中,存在则返回True,否则返回False,语法为:key in dict。

In [15]: dict_1
Out[15]: {'name': None, 'age': 24, 'sex': None} In [16]: print('name' in dict_1)
True In [17]: print('nama' in dict_1)
False

在python 2中该功能使用has_key()方法实现。

items()

以列表形式返回可遍历的(键, 值)元组数组,语法为dict.items()。

In [18]: dict_1
Out[18]: {'name': None, 'age': 24, 'sex': None} In [19]: print(dict_1.items())
dict_items([('name', None), ('age', 24), ('sex', None)]) In [20]: for key, value in dict_1.items():
...: print(key, value)
...:
name None
age 24
sex None

keys()

以列表返回一个字典的所有键:dict.keys()

In [21]: dict_1
Out[21]: {'name': None, 'age': 24, 'sex': None} In [22]: print(dict_1.keys())
dict_keys(['name', 'age', 'sex'])

values()

以列表形式返回字典中的所有值:dict.values()

In [27]: dict_1
Out[27]: {'name': None, 'age': 24, 'sex': None, 'sub_name': 'Tony'} In [28]: print(dict_1.values())
dict_values([None, 24, None, 'Tony'])

setdefault()

和get()类似,用户获得与给顶尖相关联的值,不同的是,该方法如果键不存在时会添加键并将值设为默认值,语法为:dict.setdefault(key, default=None)。

In [23]: dict_1
Out[23]: {'name': None, 'age': 24, 'sex': None} In [24]: print(dict_1.setdefault('name'))
None In [25]: print(dict_1.setdefault('name', 'Tony'))
None In [26]: print(dict_1.setdefault('sub_name', 'Tony'))
Tony In [27]: dict_1
Out[27]: {'name': None, 'age': 24, 'sex': None, 'sub_name': 'Tony'}

update()

语法为:dict_1.update(dict_2),用于把dict_2的键值对更新到dict_1中,如果有相同的键会被覆盖。

In [31]: dict_1
Out[31]: {'name': None, 'age': 24, 'sex': None, 'sub_name': 'Tony'} In [32]: dict_2
Out[32]: {'name': 'Mary', 'age': 18, 'sex': None, 'sub_name': ''} In [33]: dict_1.update(dict_2) In [34]: dict_1
Out[34]: {'name': 'Mary', 'age': 18, 'sex': None, 'sub_name': ''}

clear()

删除字典中的所有项,dict.clear(),举个例子:

In [1]: dict_1 = dict(name="Tony", age=24)

In [2]: dict_2 = dict_1

In [3]: print(dict_2)
{'name': 'Tony', 'age': 24} In [4]: dict_2.clear() In [5]: dict_2
Out[5]: {} In [6]: dict_1
Out[6]: {}

copy()

浅拷贝原始字典,返回一个具有相同键值对的新字典,dict.copy(),举个例子:

In [1]: dict_1 = dict(name='Tony', info=['boy', 24])

In [2]: dict_3 = dict_1.copy()

In [3]: dict_3['name'] = "Ring"

In [4]: dict_3['info'].remove('boy')

In [5]: dict_3
Out[5]: {'name': 'Ring', 'info': [24]} In [6]: dict_1
Out[6]: {'name': 'Tony', 'info': [24]}

fromkeys()

创建一个新字典,dict.fromkeys(seq[, value]),以序列seq中的元素做字典的键,value为字典所有键对应的初始值,其中value为可选参数, 默认为None。适用于数据初始化,举个例子:

In [1]: info = ['name', 'age', 'sex']

In [2]: dict_1 = dict.fromkeys(info)

In [3]: dict_1
Out[3]: {'name': None, 'age': None, 'sex': None}

常见操作

合并字典

有四种方式:

  1. 常规处理
In [15]: dict_1
Out[15]: {'Tony': 24} In [16]: dict_2
Out[16]: {'ben': 18} In [17]: dict3 = dict() In [18]: for key, value in dict_1.items():
...: dict_3[key] = value
...: In [19]: for key, value in dict_2.items():
...: dict_3[key] = value
...: In [20]: dict_3
Out[20]: {'Tony': 24, 'ben': 18}
  1. update()
In [9]: dict_1
Out[9]: {'Tony': 24} In [10]: dict_2
Out[10]: {'ben': 18} In [12]: dict_3 = dict_1.copy() In [13]: dict_3.update(dict_2) In [14]: dict_3
Out[14]: {'Tony': 24, 'ben': 18}
  1. 借助字典的dict(d1, **d2)方法
In [33]: dict_1
Out[33]: {'Tony': 24} In [34]: dict_2
Out[34]: {'ben': 18} In [35]: dict_3 = dict(dict_1, **dict_2) In [36]: dict_3
Out[36]: {'Tony': 24, 'ben': 18}

进阶

字典推导式

和列表推导式类似,优点是底层用C实现,会快很多,推荐使用。

对换字典的键值

使用字典推导式可以轻松对换一个字典的键值:

In [42]: dict_4
Out[42]: {24: 'Tony', 18: 'ben'} In [43]: dict_3
Out[43]: {'Tony': 24, 'ben': 18} In [44]: dict_4 = {k:v for v, k in dict_3.items()} In [45]: dict_4
Out[45]: {24: 'Tony', 18: 'ben'}

从字典中提取子集

想创建一个字典,其本身是另一个字典的子集。

举个例子:

In [88]: a = {'Ben': 18, 'Jack': 12, 'Ring': 23, 'Tony': 24}

In [89]: b = {k:v for k, v in a.items() if v > 18}

In [90]: b
Out[90]: {'Ring': 23, 'Tony': 24}

生成有序字典

在Python3.6之前的字典是无序的,但是有时候我们需要保持字典的有序性,orderDict可以在dict的基础上实现字典的有序性,这里的有序指的是按照字典key插入的顺序来排列,这样就实现了一个先进先出的dict,当容量超出限制时,先删除最早添加的key。

举例:

In [49]: from collections import OrderedDict

In [50]: ordered_dict = OrderedDict([('a', 2), ('b', 4), ('c', 5)])

In [51]: for key, value in ordered_dict.items():
...: print(key, value)
...:
a 2
b 4
c 5

可以看到OrderedDict是按照字典创建时的插入顺序来排序。

原理:OrderedDict内部维护了一个双向链表,它会根据元素加入的顺序来排列键的位置,这也就导致OrderedDict的大小是普通字典的2倍多。

合并列表中key相同的字典

也就是生成所谓的一键多值字典,需要将对应的多个值保存在其它容器比如列表或集合,取决于多值是否需要保证唯一性。

举个例子:

In [64]: from collections import defaultdict

In [65]: a = [{'a': 1}, {'b': 3}, {'c': 4}, {'a':5}, {'b':2}, {'b': 4}]

In [66]: b = defaultdict(list)

In [67]: [b[k].append(v) for item in a for k, v in item.items()]
Out[67]: [None, None, None, None, None, None] In [68]: b
Out[68]: defaultdict(list, {'a': [1, 5], 'b': [3, 2, 4], 'c': [4]}) In [69]: b['a']
Out[69]: [1, 5]

寻找两个字典的异同

场景:寻找两个字典中的异同,包括相同的键或者相同的值。

分析:字典是一系列键值之间的映射集合,有以下特点:

  1. keys()会返回字典中的所有键,并且字典的键是支持集合操作的,所以利用集合的交叉并补即可对字典的键进行处理;
  2. items()返回(key, value)组成的对象,支持集合操作;
  3. values()并不支持集合操作,因为并不能保证所有的值是唯一的,但是如果必须要判断操作,可以先将值转化为集合来实现。

举例:

In [78]: a = {'a':1, 'b':2, 'c':3}

In [79]: b = {'b':3, 'c':3, 'd':4}

In [80]: a.keys() & b.keys()
Out[80]: {'b', 'c'} In [81]: a.keys() - b.keys()
Out[81]: {'a'} In [82]: a.items() & b.items()
Out[82]: {('c', 3)}

再举一个例子,在创建一个字典时,期望可以去除某些键:

In [85]: a
Out[85]: {'a': 1, 'b': 2, 'c': 3} In [86]: c = {k: a[key] for k in a.keys() - {'b'}} In [87]: c
Out[87]: {'a': 3, 'c': 3}

以上。

Python字典 你必须知道的用法系列的更多相关文章

  1. Python字典的基本组成以及用法

    #!/usr/bin/env python# -*- coding:utf-8 -*-"""老规矩以下方法环境2.7.x,请3.x以上版本的朋友记得格式print(输出内 ...

  2. python 字典的用法,访问、增删合并等

    python字典可以存储任意类型的对象,字典的每个键:值 冒号(:)分割,每个对直接逗号(,)分割,整个字典包含在{}中,例如:d = {key1 : value1, key2 : value2, k ...

  3. Python学习笔记——部分常用/特殊用法

    1.使用*号来展开序列,*是序列展开,每个元素都当做一个参数.ls = (1, 2, 3);foo(ls),这样foo只有一个参数,就是ls这个列表本身foo(*ls), foo得到3个参数,分别为1 ...

  4. Python操作MySQL -即pymysql/SQLAlchemy用法

    本节介绍Python对于MySQL的一些操作用法 模块1:pymysql(等同于MySQLdb) 说明:pymysql与MySQLdb模块的使用基本相同,学会pymysql,使用MySQLdb也就不是 ...

  5. Python 字典删除元素clear、pop、popitem

    同其它python内建数据类型一样,字典dict也是有一些实用的操作方法.这里我们要说的是字典删除方法:clear().pop()和popitem(),这三种方法的作用不同,操作方法及返回值都不相同. ...

  6. #11 Python字典

    前言 前两节介绍了Python列表和字符串的相关用法,这两种数据类型都是有序的数据类型,所以它们可以通过索引来访问内部元素.本文将记录一种无序的数据类型——字典! 一.字典与列表和字符串的区别 字典是 ...

  7. Python 字典 dict() 函数

    描述 Python 字典 dict() 函数用于创建一个新的字典,用法与 Pyhon 字典 update() 方法相似. 语法 dict() 函数函数语法: dict(key/value) 参数说明: ...

  8. Python pytagcloud 中文分词 生成标签云 系列(一)

    转载地址:https://zhuanlan.zhihu.com/p/20432734工具 Python 2.7 (前几天试了试 Scrapy 所以用的 py2 .血泪的教训告诉我们能用 py3 千万别 ...

  9. Python 字典 update() 方法

    描述 Python 字典 update() 方法用于更新字典中的键/值对,可以修改存在的键对应的值,也可以添加新的键/值对到字典中. 用法与 Python dict() 函数相似. 语法 update ...

随机推荐

  1. python 安装pyqt

    ---恢复内容开始--- 一.安装 1.官网:www.riverbankcomputing.com 2.使用命令安装,可以自动去官网查找与Python版本号相同的程序进行下载,比较方便,如果不是这样也 ...

  2. Vue部分编译不生效,解决Vue渲染时候会闪一下

    0828自我总结 Vue部分编译不生效,解决Vue渲染时候会闪一下 一.Vue编译不生效 在标签里添加v-pre <script src="vue.js"></s ...

  3. Redis 哨兵机制以及灾难演练

    #### 哨兵都采用这个配置即可 ##### 1.修改sentinel.conf配置文件 ![image](https://img2018.cnblogs.com/blog/1334966/20191 ...

  4. MySQL make_set()的用法

    MAKE_SET(bits,str1,str2,…)返回一个设定值(含子字符串分隔字符串","字符),在设置位的相应位的字符串.str1对应于位0,str2到第1位,依此类推.在s ...

  5. [JZOJ5772]【NOIP2008模拟】今天你AK了吗?

    Description AK:All kill“你为什么没背书?”“没有为什么,我就是没背书.”“……我去年买了个表,G—U—N!”头铁王InFleaKing把背书的时间都拿去列排列了......n= ...

  6. 浏览器标签tab窗口切换时事件状态侦听

    做到 是大屏项目,用的websocket,在浏览器切换标签窗口后,过了一段时间回来,页面会非常卡,所以想页面切回来的时候刷新页面,找到了这个方法,这是原来的例子.这段代码可以自己复制去做下测试 var ...

  7. Uipath 选择页面下拉列表中的选项

    http://www.rpatokyo.com/ 使用Select item Activity选择页面下拉列表中的选项 在open browser中拖入Select Item Activity,配置参 ...

  8. C#的集合类型及使用技巧

    在日常开发过程中,我们不能避免的要对批量数据处理,这时候就要用到集合.集合总体上分为线性集合和非线性集合.线性集合是指元素具有唯一的前驱和后驱的数据结构类型:非线性集合是指有多个前驱和后驱的数据结构类 ...

  9. Redis学习四(运维指南).

    一.上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性. redis 的运行机器 CPU 不求核数多,但求主频高 ...

  10. mac安装MongoDB教程

    目录 介绍 下载安装 方法1 方法2 配置 配置PATH 创建log和data目录 启动 关闭 介绍 基于分布式文件存储的数据库,使用C++编写. 应用最广泛的非关系型数据库(NoSQL). NoSQ ...