高估自己了?Python 字典这6个使用技巧着实太妙!

共 3152字,需浏览 7分钟

 ·

2022-03-04 13:59

关注"Python学习与数据挖掘"

设为“置顶或星标”,第一时间送达干货

资料专栏

李航老师《统计学习方法(第二版)》课件&代码

【视频+PPT】李宏毅老师机器学习40讲

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 中最重要的数据结构之一。因此,知道一些技巧来做一些频繁的操作是非常重要的,这些技巧不仅可以节省我们重新发明轮子的时间,还可以提供更高的性能。

长按或扫描下方二维码,后台回复:加群,即可申请入群。一定要备注:来源+研究方向+学校/公司,否则不拉入群中,见谅!

长按三秒,进入后台


推荐阅读

浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报