Set集合的知识点总结

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

知识点1:

介绍

当表示set集合为空集合时候,值得注意的地方:

在 Python 中,{} 是用来定义空字典(dict)的语法,而不是空集合(set)。

因此,当你写 s = {} 时,Python 会将其解释为一个空字典,而不是一个空集合。

空集合的定义方式:在 Python 中,集合(set)是一个无序且不重复的元素集合。集合的定义方式是使用 set() 函数,而不是用 {}

案例如下:

# 定义一个空字典
s = {}
print(type(s))  # 输出结果:<class 'dict'>

# 定义一个空集合
s = set()
print(type(s))  # 输出结果:<class 'set'>

知识点2:

介绍

s = {1,6,8}
print(type(s)) # 输出结果:<class 'set'>
print(s) # 输出结果:{8, 1, 6}

s = {1,8,6}
print(s) # 输出结果:{8, 1, 6}

尽管集合的输出结果看起来是一样的。这是因为集合的元素顺序是不确定的,并且在某些情况下,Python 的实现细节导致了相同的输出顺序。但这并不意味着集合的顺序是固定的,它只是偶然的结果。

小结:

# 集合(set)是无序的,它不保证元素的存储顺序。
# 在 Python 中,集合的内部实现是基于哈希表的,
# 这意味着集合中的元素存储顺序与它们被添加的顺序无关,而是由哈希值决定的。

知识点3

介绍

哈希表(Hash Table),也称为散列表,是一种通过哈希函数将数据映射到存储位置的数据结构,用于实现快速的插入、查找和删除操作。它是一种非常高效的数据结构,广泛应用于编程语言的底层实现(如字典、集合等)以及各种需要快速数据访问的场景。

知识点4

介绍

在 Python 中,集合(set)的元素必须是**可哈希(hashable)**的类型。这是因为集合的内部实现基于哈希表,而哈希表需要通过哈希值来快速定位和管理元素。

1. 可哈希(Hashable)的定义

一个对象是可哈希的,如果它满足以下条件:

  • 它有一个哈希值,可以通过 hash() 函数计算。

  • 哈希值在其生命周期内保持不变(即对象的内容不能改变)。

Python 中的不可变类型(如 intfloatstrtuple 等)通常是可哈希的,因为它们的值不可变。而可变类型(如 listdictset 等)通常是不可哈希的,因为它们的内容可以改变。

知识点5

介绍

集合(set)本身是可变的,但集合中的元素必须是不可变的。

集合的“可变性”与“不可变性”的解析:

集合的“可变”:

集合(set)是一种可变的数据结构,这意味着你可以随时添加或删除其中的元素。例如:

s = {1, 2, 3}
s.add(4)  # 添加元素
s.remove(2)  # 删除元素
print(s)  # 输出:{1, 3, 4}

由于集合的内容可以改变,它本身是可变的

集合的“不可变性”

1)不可变集合(frozensetfrozenset是一个不可变的集合类型,它不能被修改,但它的元素同样必须是不可变的。

frozenset 的特性
  • 不可变性frozenset 的内容在创建后不能被修改,包括添加、删除或修改元素。

  • 可哈希性:由于不可变性,frozenset 是可哈希的,可以作为字典的键或其他集合的元素。

  • 无序性:与普通集合一样,frozenset 是无序的,不支持索引访问。

  • 去重性frozenset 中的元素是唯一的,重复的元素会被自动去除。

2)集合中的元素必须是不可变的,例如,可以将整数、浮点数、字符串、元组等不可变类型放入集合中,但不能将列表、字典、集合等可变类型直接放入集合中。

知识点6

介绍

查询set集合中某一个单一元素的hash值

查询set结合中所有元素的hash值

"一" 的 Unicode 编码值是 20000。

"路" 的 Unicode 编码值是 36771。

"发" 的 Unicode 编码值是 21471。

知识点7

介绍

这里能看到“一路发发”的每次hash值不一样。

原因:

从 Python 3.3 开始,为了增强安全性,Python 引入了哈希值随机化(Hash Randomization)。这意味着每次运行 Python 程序时,字符串等对象的哈希值可能会不同。哈希值随机化是为了防止某些类型的攻击(如拒绝服务攻击)和减少哈希冲突的可能性。

因此,当你在不同运行环境中运行代码时,或者在不同时间运行代码时,字符串 "一路发发" 的哈希值可能会不同。

如何避免哈希值随机化?

如果你需要在不同运行环境中获得一致的哈希值,可以设置环境变量 PYTHONHASHSEED 为一个固定的值(例如 0)。这会禁用哈希值随机化。

1. import os

这行代码的作用是导入 Python 的 os 模块。os 模块提供了与操作系统交互的功能,包括操作文件和目录、获取环境变量、设置环境变量等。

2. os.environ["PYTHONHASHSEED"] = "0"

这行代码的作用是设置环境变量 PYTHONHASHSEED 的值为 "0"。环境变量 PYTHONHASHSEED 是 Python 用于控制哈希值随机化的种子值。

具体解释:
  • PYTHONHASHSEED
    • 这是一个特殊的环境变量,用于控制 Python 中字符串和其他可哈希对象的哈希值计算方式。

    • 默认情况下,Python 会随机化哈希值的种子(即 PYTHONHASHSEED 的值),以增强安全性(防止某些类型的攻击)。

    • 设置 PYTHONHASHSEED 为一个固定的值(如 "0"),可以禁用哈希值的随机化,使得每次运行程序时,相同的字符串或对象总是生成相同的哈希值。

  • os.environ
    • 这是一个字典对象,表示当前进程的环境变量。

    • 通过 os.environ,你可以读取或修改环境变量。

  • "0"
    • PYTHONHASHSEED 设置为 "0",表示禁用哈希值的随机化。

    • 如果设置为其他值(如 "1""42"),哈希值仍然会随机化,但每次运行程序时,随机化的种子是固定的。

温馨提醒:在大多数情况下,不建议固定哈希值,尤其是在涉及安全性的场景中。固定哈希值可能会带来一些安全风险,

知识点8

介绍

这里举例说明,集合里面元素的不重复性

s = {8, 1, 6, 6}
print(sorted(s))

输出结果为:

[1, 6, 8]

为什么没有两个 6

  1. 集合的特性

    • 集合的定义是无序且不重复的元素集合。

    • 如果你尝试将重复的元素添加到集合中,集合会自动忽略重复的元素。

  2. 集合的去重机制

    • 当你创建集合时,Python 会自动检查元素是否重复。

    • 如果发现重复的元素,集合只会保留一个。

知识点9

介绍

为什么 s = {8,1,6,6}这个set集合在输出结果的时候,变更成了[1,6,8]列表类型?

[1, 6, 8]

1. 集合(set)和列表(list)的区别

  • 集合(set

    • 使用 {} 定义(注意:空集合需要用 set() 定义)。

    • 是一个无序且不重复的元素集合。

    • 不支持索引访问(因为它是无序的)。

    • 示例:s = {8, 1, 6, 6},输出结果为 {1, 6, 8}

  • 列表(list

    • 使用 [] 定义。

    • 是一个有序的元素集合,允许重复。

    • 支持索引访问。

    • 示例:lst = [8, 1, 6, 6],结果为 [8, 1, 6, 6]

2. sorted() 函数的作用

sorted() 是 Python 的内置函数,用于对可迭代对象(如列表、集合、字典等)进行排序,并返回一个新的列表。它的返回值类型总是 list,而不是其他类型。

  • 当你对集合进行排序时,sorted() 会:

    1. 将集合中的元素提取出来。

    2. 按照从小到大的顺序对元素进行排序。

    3. 返回一个有序的列表

所以最后的输出结果为:

[1, 6, 8]

 

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HaoChen/ChenHao

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值