Python里的dict和set的背后小秘密

当我们在Python中使用dict(字典)和set(集合)这两种数据结构时,它们的背后其实有许多小秘密。在本文中,我们将简要地介绍这些秘密。

Python字典(dict)的小秘密

接受任意类型作为键名

Python的字典是一种哈希表,允许使用任意可哈希(hashable)的数据类型作为键名。哈希表使用键名的哈希值来快速定位键值对,因此键名必须是不可变的(immutable)。常见的可哈希类型包括整数、字符串、元组。

不过,Python的字典却非常灵活,甚至可以使用自定义的类作为键名。如果自定义类没有实现哈希值和相等性比较,那么Python会自动为其生成哈希值,并根据对象的id来比较它们是否相等。下面是一个简单的示例:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

d = {Person('Alice', 25): 'Alice is 25 years old.'}

print(d[Person('Alice', 25)])

在这个例子里,我们使用自定义的Person类作为字典的键名,不过我们并没有为其实现哈希值和相等性比较。不过,由于Person类的每个实例都有唯一的id,因此在字典中它们会被视作不同的键名。

插入顺序是有利于查询的

在Python字典中,键值对的插入顺序会被保留。这个特性是从Python 3.7版本开始引入的,它意味着字典中的键值对可以按照插入顺序依次进行访问。比如说,我们可以使用collections.OrderedDict类来创建一个带有插入顺序的字典,下面是一个简单的示例:

from collections import OrderedDict

d = OrderedDict()

d['a'] = 1
d['b'] = 2
d['c'] = 3
d['d'] = 4

print(d.keys())  # odict_keys(['a', 'b', 'c', 'd'])

在这个例子里,我们首先创建了一个空的OrderedDict实例,然后依次插入了四个键值对。最后,我们使用keys()方法来查看所有键名,发现它们的顺序正是我们插入时的顺序。

Python集合(set)的小秘密

可以用于列表去重

在Python中,我们可以使用集合来快速的对一个列表进行去重。集合可以保证其中的每个元素都是唯一的,因此我们只需要将列表转换为集合,然后再将其转换回列表即可。下面是一个简单的示例:

lst = [1, 2, 3, 1, 2, 3, 4, 5]

lst = list(set(lst))

print(lst)  # [1, 2, 3, 4, 5]

在这个例子里,我们首先定义了一个包含重复元素的列表lst,然后使用set()函数将其转换为集合,并使用list()函数将其转换回列表。最终,我们得到了一个没有重复元素的列表。

可以进行基本的集合操作

Python的集合不仅可以用来进行去重,还能进行一些基本的集合操作,例如并集、交集、差集等。这些操作都可以通过集合对象的方法来实现,下面是一些示例:

s1 = {1, 2, 3, 4}
s2 = {3, 4, 5, 6}

# 并集
print(s1.union(s2))  # {1, 2, 3, 4, 5, 6}

# 交集
print(s1.intersection(s2))  # {3, 4}

# 差集
print(s1.difference(s2))  # {1, 2}

# 对称差集
print(s1.symmetric_difference(s2))  # {1, 2, 5, 6}

在这个例子里,我们定义了两个集合s1s2,并对其进行了一些基本的集合操作。可以看到,这些操作通过集合对象的方法比较容易实现,而且非常高效。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python里的dict和set的背后小秘密 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Python – 文件处理 – 无法将’int’对象隐式转换为str [重复]

    【问题标题】:Python – File handling – Can’t convert ‘int’ object to str implicitly [duplicate]Python – 文件处理 – 无法将’int’对象隐式转换为str [重复] 【发布时间】:2023-04-06 11:31:01 【问题描述】: 我正在尝试将冒险游戏的故事从文件读…

    Python开发 2023年4月6日
    00
  • 详解Python 尾递归优化

    Python尾递归优化是一种减少函数调用次数,从而优化函数性能的技术。尾递归函数是指在函数的最后一步调用自身,且没有后续的计算需要执行。 尾递归优化仅能被递归函数使用,因此我们需要定义递归函数。Python默认并不支持尾递归优化,但我们可以手动实现它。下面是尾递归优化的详细攻略: 了解递归 首先你需要知道什么是递归,递归就是函数自己调用自己。 理解尾递归 尾…

    python-answer 2023年3月25日
    00
  • 一起来了解python的基本输入和输出

    一起来了解Python的基本输入和输出 什么是Python输入和输出 Python输入和输出是Python程序中必不可少的部分,主要用于程序的交互。 Python的标准输入主要来自于input()函数,标准输出主要来自于print()函数。 如何使用input()函数 input()函数主要用于获取用户从标准输入中输入的数据。函数的使用方式如下: varia…

    python 2023年6月5日
    00
  • 您可以从 Windows 符号链接导入 Python 模块吗?

    【问题标题】:Can you import a Python module from a Windows symbolic link?您可以从 Windows 符号链接导入 Python 模块吗? 【发布时间】:2023-04-03 02:44:02 【问题描述】: 我正在使用 Windows 7 计算机为 Python 3 项目做出贡献。 为了在进行和测试…

    Python开发 2023年4月8日
    00
  • 详细介绍Python中的set集合

    详细介绍Python中的set集合 简介 set是Python的一种数据结构,类似于数学中的集合概念。set中可以存储多个元素,但每个元素必须是唯一的,即不能出现重复元素。 set是无序的,不能通过下标进行访问,但是可以遍历set中所有元素。 set可以进行交集、并集、差集等操作,是处理相同数据的好工具。 创建set 可以通过以下两种方式创建set: 直接创…

    python 2023年5月13日
    00
  • 使用pandas将numpy中的数组数据保存到csv文件的方法

    下面是使用pandas将numpy中的数组数据保存到csv文件的完整攻略。 1. 导入pandas和numpy模块 在使用pandas将numpy中的数组数据保存到csv文件前,需要先导入pandas和numpy模块。具体操作如下: import pandas as pd import numpy as np 2. 创建numpy数组数据 为了进行示例说明,…

    python 2023年6月3日
    00
  • torch.optim优化算法理解之optim.Adam()解读

    下面是对于“torch.optim优化算法理解之optim.Adam()解读”的完整攻略。 1. 优化算法概述 在神经网络训练的过程中,我们需要选择一个好的优化算法来更新模型中的参数,这个过程就是优化算法。优化算法可以通过最小化损失函数来更新参数,以便更好地拟合数据。 目前常用的优化算法有SGD、Adam、RMSprop等,每个算法都有自己的优缺点,选用不同…

    python 2023年6月6日
    00
  • Python 使用reduce()和partial()

    下面是 Python 使用 reduce() 和 partial() 的完整攻略。 reduce() 函数 reduce() 函数是 Python 内置的一个函数,可以对一个列表或可迭代对象中的所有元素连续使用一个函数进行操作,得到最终的结果。例如,我们可以通过 reduce() 函数来实现对列表中所有元素进行相加的操作。 reduce() 函数的用法如下所…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部