高估自己了?Python 字典这6个使用技巧着实太妙!
关注"Python学习与数据挖掘"
设为“置顶或星标”,第一时间送达干货
Python 的优点之一是字典可以与 JSON 对象无缝集成,这使得字典数据结构的使用比其他编程语言更频繁。
在这篇文章中,我将介绍 6 个关于 Python 字典的技巧,相信如果你以前不知道这些技巧,你会从中受益。喜欢本文点赞、收藏、关注
1、按值对字典数组进行排序
我们从一些 Web API 接收 JSON 对象数组是很常见的。假设我们已经在 Python 列表中读取了它们。现在我们要按照里面的某个值对这些字典进行排序。
通常,当我们想要对列表进行排序时,sorted() 函数将非常容易使用。但是,这一次我们要根据它包含的字典对象的值对列表进行排序。事实上, sorted() 函数有一个参数叫做 key。
让我们首先创建一个字典列表。假设我们想按人们的年龄对字典进行排序。
students = [
{'name': 'Alice', 'age': 40},
{'name': 'Bob', 'age': 37},
{'name': 'Chris', 'age': 33}
]
然后,我们可以这样创建一个函数:
def get_age(dict_item):
return dict_item['age']
现在,我们可以在 sorted() 函数中使用 get_age 函数
sorted(students, key=get_age)
我们可以看到 get_age() 函数非常简单,我们可以将它简称为 lambda 函数。
sorted(students, key=lambda item: item['age'], reverse=True)
在上面的例子中,我们使用 lambda 编写了一个内联函数。
我们展开按 key 排序的用法
虽然这不适用于字典,但我只想展示 sorted()函数的扩展用法。假设我们有一个字符串列表如下
strings = [
'aaa3',
'bbb2',
'ccc1',
'ddd5'
]
如果我们使用 sorted() 函数对其进行排序,则必须基于每个字符串的首字母。因此,不应更改顺序。但是,如果我们想根据最后一位数字对列表进行排序怎么办?我们可以编写一个 lambda 函数来获取字符串的最后一个字符。
2、按键或值对字典进行排序
my_dict = {'c': 1, 'b': 2, 'a': 3}
在 Python 3.6 之前,不要为此烦恼,因为字典是无序实现的。换句话说,我们只能对字典进行排序并按顺序打印。这可以在 for 循环中轻松完成。如果项目的顺序很重要,我们需要使用 Ordered Dictionary。
from collections import OrderedDict
my_ordered_dict = OrderedDict(sorted(my_dict.items()))
但是从 Python 3.6 开始,字典将具有顺序,这意味着对字典进行排序开始变得有意义。如果我们想按字典的键对字典进行排序,我们可以简单地使用 sorted() 函数对项目进行排序,然后将它们转换回字典。
按字典值排序
如果我们想按值对字典进行排序,我们将需要再次使用从前面的问题中得到的技巧。那就是使用 sorted() 函数的关键参数。
dict(sorted(my_dict.items(), key=lambda item: item[1]))
由于字典的 items() 将返回元组,我们可以使用订阅 [1] 访问它的第二个元素,这将是值。
3、使用推导创建字典
当我们想用 for 循环创建一个逻辑简单的字典时,使用字典推导可以非常简洁高效。
例如,我们想使用 sqaure_x 作为键,其中 x 是一个数字,那么这个值应该是对应值的平方。我们可以使用带有 range() 函数的 for 循环来获取数字序列,然后按如下方式创建字典。
4、将两个列表拼接成字典
有时,我们可能会分别获取键和值。两个能够将接收到的列表反序列化为字典以供以后使用,我们必须将它们拼接在一起。
通常我们可以使用 for 循环,本文分享一个更好的方法,它非常 Pythonic。
keys = ['name', 'age', 'skill']
values = ['Chris', 33, 'Python']
my_dict = dict(zip(keys, values))
使用 zip() 函数还有更多好处。例如,如果我们有两个长度不同的列表,多余的项目将被忽略。
keys = ['name', 'age', 'skill']
values = ['Chris', 33, 'Python', 'English']
my_dict = dict(zip(keys, values))
在上面的示例中,第二个列表中的字符串"English"被忽略了,因为它没有对应的键。
如果我们知道列表长度应该严格相同,我们也可以强制执行。所以,如果两个列表的长度不同,就会抛出错误。请注意,此严格标志是在 Python 3.10 中添加的。
5、合并两个字典
合并两个或多个字典可能是非常频繁的操作,它最棘手的是在不同的 Python 版本中使用不同的方法。
在 Python 3.4 或更低版本中
我们可以使用字典的 update() 函数。它会将另一个字典附加到当前字典。但是,缺点是第一个字典 my_dict1 被修改了。如果我们想保留两个原始字典,我们必须创建第三个。
从 Python 3.5 开始,它将用于解压列表的星号 *list 语法扩展为使用双星号 **dictioanry 解压字典。
因此,我们可以创建一个新字典,并将其中的两个原始字典解包。
从 Python 3.9 开始
在 Python 3.9 中,涉及到一种新语法,即使用管道 | 合并两个字典。
6、更改密钥的名称
如果我们想更改密钥的名称怎么办?假设我们从一个 API 接收到 JSON 对象,但是键名与我们在数据库中的不一致。因此,在将对象保存到数据库之前,我们需要更改键的名称。
请不要写一个for循环来查找有key的item,除非有很多key需要按照一定的规则改变。相反,一种简单的方法是使用简单地将值传递给新项目,然后删除旧项目。执行上述示例后,键"skill"已更改为"programming_language"。这是实现这一点的最直观的方法。但是,我们甚至可以通过使用字典的 pop() 函数来简化它。
这个想法是在字典中创建一个新键并从弹出的旧键值对中获取值。之后,用旧值创建新键,旧键值对已经消失。
总结
字典是 Python 中最重要的数据结构之一。因此,知道一些技巧来做一些频繁的操作是非常重要的,这些技巧不仅可以节省我们重新发明轮子的时间,还可以提供更高的性能。
长按或扫描下方二维码,后台回复:加群,即可申请入群。一定要备注:来源+研究方向+学校/公司,否则不拉入群中,见谅!
(长按三秒,进入后台)
推荐阅读