Python中使用字典的几个小技巧
1 解包
所谓解包,就是将字典通过 ** 操作符转为 Key=Value 的形式,这种形式可以直接传给函数作为关键字参数。
说说适用的几种情况。
1.1 搜索拼接条件
当应用中使用类似 SQLAlchemy 的 ORM 形式读取数据的时候,不同搜索条件,传入给 ORM 的搜索参数也随之改变。
下面是图书表的部分数据(只展示了部分字段)
+----+---------------+-------------------------+-------+
| id | category_name | book_name | price |
+----+---------------+-------------------------+-------+
| 1 | 人文社科 | 人类简史 | 42.90 |
| 2 | 人文社科 | 世界简史 | 25.50 |
| 3 | 经济管理 | 极致产品 | 37.00 |
| 4 | 经济管理 | 史蒂夫·乔布斯传 | 44.20 |
| 5 | 经济管理 | 影响力 | 41.20 |
+----+---------------+-------------------------+-------+
搜索时,我们会以这样的形式执行查询方法
books = Book.query.filter_by(id=1, book_name='影响力').all()
但是由于传入参数会根据搜索条件的变化而变化,无法直接写出有哪些参数,这个时候就可以使用字典解包
condition = {}
if book_id:
condition['id'] = id
if book_name:
condition['name'] = book_name
books = Book.query.filter_by(**condition).all()
这样就 OK 了
1.2 方法参数太多,为代码美观使用
new_book = Book(category_name='文学小说', book_name='解忧杂货店', price=28.8,
...)
db.session.add(new_book)
改成这样的话,美观一些
book_param = {'category_name': '文学小说', 'book_name': '解忧杂货店', 'price': 28.8,
...}
new_book = Book(**book_param)
db.session.add(new_book)
并且,在上述新增图书过程中,都会对提交的参数进行校验,而校验方法返回的结果(也就是 book_param 和其它信息)一般也都是字典,所以使用字典解包的方式更符合实际场景。
总之,适当使用字典解包对方法进行传参,可以让我们的代码更灵活。
2 setdefault() 的使用
先看下这个方法怎么使用
dict.setdefault(key, default=None)
如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。
很多时候我们需要对列表根据元素的某个 key 转化成一个包含列表的字典。比如,上面的数据中,我希望得到一个字典,字典的 key 是图书分类,value 是属于该分类的图书列表。我们通常会这样写
books_dict = {}
for book in book_list:
if book['category_name'] not in books_dict.keys():
books_dict[book['category_name']] = []
books_dict[book['category_name']].append(book)
当然,这样写是正确的,能得到预期结果
{
"人文社科": [{
"id": 1,
"category_name": "人文社科",
"book_name": "人类简史",
"price": 42.9
}, {
"id": 2,
"category_name": "人文社科",
"book_name": "世界简史",
"price": 25.5
}],
"经济管理": [{
"id": 3,
"category_name": "经济管理",
"book_name": "极致产品",
"price": 37.0
}, {
"id": 4,
"category_name": "经济管理",
"book_name": "史蒂夫·乔布斯传",
"price": 44.2
}, {
"id": 5,
"category_name": "经济管理",
"book_name": "影响力",
"price": 41.2
}]
}
但是如果使用字典的 setdefault() 方法话,可以少写几行代码,看起来也优雅一些
books_dict = {}
for book in book_list:
books_dict.setdefault(book['category_name'], []).append(book)
3 字典合并
常用的合并方式
# new_dict = {**dict1, **dict2, ...}
# 合并多个字典,如果字典中存在相同的 key 的话,后面的会覆盖掉前面的
# 比如 dict2 会覆盖 dict1 中的 key 相同的值
>>> a = {'name': 'x', 'age': 13}
>>> b = {'name': 'y'}
>>> c = {**a, **b}
>>> c
{'name': 'y', 'age': 13}
# dict1.update(dict2)
# 合并两个字典,如果字典中存在相同的 key 的话,dict2 会覆盖 dict1 的对应值
# 理解为更新某个字典应该更合适
>>> a.update(b)
>>> a
{'name': 'y', 'age': 13}
有时我们碰到合并字典的情况也不少。比如,我们准备根据一本书的基本信息创建一本新书
# to_dict 将 ORM 对象转为字典,是自定义的,理解意思就好
base_book = Book.query.filter_by(id=1).first().to_dict()
# 提交的参数需要校验,校验成功后返回值包含 book_param ,内容和下面类似
book_param = {'book_name': '国家宝藏', 'price': 55.60}
# 同时需要更新新书的创建时间和更新时间
time_param = {'created_at': current_time, 'updated_at': current_time}
# 新增书籍
new_book = Book(**{**base_book, **book_param, **time_param})
db.session.add(new_book)
当然,如果只是合并两个字典的话,也可以使用 update() 方法。
假设我们只需要合并 base_book 和 book_param
base_book.update(book_param)
这也可以工作,不过要注意,这样会修改 base_book 中的值。
如果只是单纯的更新某个字典的信息的话,update() 方法显然最合适。对于当前需求的话,还是第一种方式更合适。
本文首发于公众号「小小后端」,关注并回复「HMPython2018」领取 18 年很赞的 Python 学习教程。
Python中使用字典的几个小技巧的更多相关文章
- Python中实用却不常见的小技巧
https://mp.weixin.qq.com/s?__biz=MzI5NDY1MjQzNA==&mid=2247489061&idx=2&sn=65cec7fa471b1e ...
- 如何将xml转为python中的字典
如何将xml转为python中的字典 import cElementTree as ElementTree class XmlListConfig(list): def __init__(self, ...
- Python中的字典与集合
今天我们来讲一讲python中的字典与集合 Dictionary:字典 Set:集合 字典的语法: Dictionary字典(键值对) 语法: dictionary = {key:value,key: ...
- [转]11个教程中不常被提及的JavaScript小技巧
原文地址: https://www.cnblogs.com/ld1024/p/10723827.html 这次我们主要来分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日 ...
- 11个教程中不常被提及的JavaScript小技巧
这次我们主要来分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日常工作中经常出现,但是我们又很容易忽略. 1.过滤唯一值 Set类型是在ES6中新增的,它类似于数组,但是 ...
- 「Python-Django」Django中使用数据库的 9 个小技巧
Django 中使用数据库的 9 个小技巧. 1. 过滤器聚合 在 Django 2.0 之前,如果你想得到“用户总数”.“活跃用户总数”等信息时,你不得不使用条件表达式. Django 2.0 中, ...
- python中的字典(dict),列表(list),元组(tuple)
一,List:列表 python内置的一种数据类型是列表:list.list是一种有序的数据集合,可以随意的添加和删除其中的数据.比如列出班里所有的同学的名字,列出所有工厂员工的工号等都是可以用到列表 ...
- 13.python中的字典
字典其实和之前的元祖和列表功能相似,都是用来储存一系列对象的.也就是一种可变容器,或者是我所比喻的革新派的菜单. 但也不是完全相同,我在之前曾经将字典称为特殊的'序列',是字典拥有序列的部分特性,但是 ...
- python中 字符 字典 列表之间的转换
1 字典 转 字符 定义一个字典:dict = {'name': 'python', 'age': 7}字典转字符 可以使用str强制转换 如: str(dict) 此时dict的类型就是字符型了 2 ...
随机推荐
- 死磕 java同步系列之终结篇
简介 同步系列到此就结束了,本篇文章对同步系列做一个总结. 脑图 下面是关于同步系列的一份脑图,列举了主要的知识点和问题点,看过本系列文章的同学可以根据脑图自行回顾所学的内容,也可以作为面试前的准备. ...
- B/S 端 WebGL 3D 游戏机教程
前言 摘要:2D 的俄罗斯方块已经被人玩烂了,突发奇想就做了个 3D 的游戏机,用来玩俄罗斯方块...实现的基本想法是先在 2D 上实现俄罗斯方块小游戏,然后使用 3D 建模功能创建一个 3D 街机模 ...
- Akka实现WordCount(Scala)
Akka实现WordCount(Scala): 架构图: 项目结构: pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- Golang 实现设计模式 —— 装饰模式
概念 "用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能" "动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活" 何时 ...
- display——table-cell属性
display的table和table-cell一般情况下用的不多,所以很少有人去关注它,但他们两个联手起来会给你惊喜! 当两个或者两个以上标签一起使用显示在同一行时,以前常用的是float.posi ...
- 移动端meta设置大全
声明文档使用的字符编码: <meta charset='utf-8'> 强制让文档与设备的宽度保持1:1,对页面设置不能进行缩放: <meta name="viewpor ...
- DataStructure之线性表以及其实现
线性表 应用:多项式的表示 什么是线性表 多项式表示问题给出的启示: 同一个问题可以有不同的表示(存储)方法 有一类共性问题 : 有序线性序列的租住和管理 “线性表(Linear List)” : 由 ...
- App上下左右滑动封装
#coding=utf-8 from appium import webdriver from time import sleep caps = { "platformName": ...
- Python3_基础
目录 数据类型 变量 数据类型的转换 算术操作符 输入 字符串常用方法 数据类型 我们先来看看三种常见的数据类型 字符串 str 在Python中,字符串一般都用引号引起来,不管是用单引号还是双引号都 ...
- Zabbix 2.2系列注入+getsehll
Zabbix 是一个开源的企业级性能监控解决方案. 官方网站:http://www.zabbix.com Zabbix 的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻 ...