Python set() 函数

Python set() 语法

set() 是 Python 的一个内置函数,它接收一个可迭代对象作为参数,然后返回一个集合。换句话来说,set() 函数可以将 “其他可迭代对象” 转换为 “集合”。

语法:

set(iterable)

说明:

set() 函数接收单个参数。

  • iterable(可选):是一个可迭代对象,包括字符串、列表、元组、字典(仅取键)、集合等。如果 iterable 省略,则返回一个空集合;如果 iterable 不省略,则创建一个由可迭代项组成的集合。

注意: set() 总是会创建一个全新的集合对象。

Python set() 摘要

使用频率
时间复杂度 O(n)
官方文档 查看
相关函数 frozenset()dict()tuple()

Python set() 示例

接下来,我们通过几个简单的例子来讲解一下 Python set() 函数是如何使用的。

示例 1:set() 将 “序列” 转换为集合

# 列表
a = ['绿', '叶', '网']
print(set(a))

# 元组
b = ('绿', '叶', '网')
print(set(b))

# 字符串
c = '绿叶网'
print(set(c))

运行结果如下。

{'网', '叶', '绿'}
{'网', '叶', '绿'}
{'网', '叶', '绿'}

示例 2:set() 将 “字典” 转换为集合

result = {'Jack': 1001, 'Lucy': 1002, 'Tony': 1003}
print(set(result))

运行结果如下。

{'Tony', 'Lucy', 'Jack'}

分析:

需要注意的是,如果 set() 的参数是一个字典,那么只会将字典的所有键作为元素组合成一个集合。

示例 3:set() 使用 “其他可迭代对象” 创建集合

a = range(5)
print(set(a))

运行结果如下。

{0, 1, 2, 3, 4}

分析:

当然了,我们也可以使用自定义的可迭代对象作为 set() 函数的参数。

set() 应用场景

如果不借助集合,想要实现列表去重是一件比较麻烦的事。我们可以先看一下常规做法是怎样实现的。

示例 4:常规做法

items = ['red', 'red', 1, 1, 2, False]
result = []
for item in items:
    if item not in result:
        result.append(item)
print(result)

运行结果如下。

['red', 1, 2, False]

分析:

在上面示例中,首先我们定义了一个空列表 result 用于保存结果。接下来遍历列表 items,如果当前元素不存在于 result 中,那么就把当前元素添加到 result 中。最后得到的 result 就是去重的列表了。

示例 5:set() 实现列表去重

items_list = ['red', 'red', 1, 1, 2, False]
items_set = set(items_list)
result = list(items_set)
print(result)

运行结果如下。

['red', 1, 2, False]

分析:

set() 函数可以将一个列表转换为一个集合,set(items_list) 的结果就是:{'red', 1, 2, False}。然后再使用 list() 函数来将一个集合转换为一个列表。对于这个例子来说,你甚至只需要用到两句代码就可以实现了。

items_list = ['red', 'red', 1, 1, 2, False]
print(list(set(items_list)))

深入了解 set()

除了基本的集合创建和操作,Python 的 set() 类型还提供了一些高级功能,让它在特定场景下更加强大。

1. 冻结集合(不可变集合)

如果想要实现一个不可变的集合,我们应该考虑使用 frozenset() 函数来实现。

frozen = frozenset([1,2,3])
print(frozen)            # 输出:frozenset({1, 2, 3})
frozen.add(4)            # 输出:AttributeError

2. 集合推导式

集合也有类似于列表推导式的语法,这种方式叫做 “集合推导式” 。

squared_set = {x**2 for x in range(-3,4)}
print(squared_set)       # 输出:{0, 1, 4, 9}

set() 最佳实践

如果只是单纯想创建一个集合,我们更推荐使用大括号 “{}” 的方式。这种方式比使用 set() 函数更简单方便。下面两种写法是等价的:

# 使用 “{}”(推荐)
colors = {'红', '绿', '蓝'}

# 使用 set()
colors = set(['红', '绿', '蓝'])

但需要注意的是,如果希望创建一个空集合,我们只能使用 set() 函数来实现。这是因为 “{}” 创建的是一个空字典。

示例 6:set() 创建空集合

a = {}
b = set()
print(type(a))
print(type(b))

运行结果如下。

<class 'dict'>
<class 'set'>

常见问题

1. 集合元素顺序为何是不固定的?

因为集合是基于哈希表实现的,元素存储位置由哈希值决定。在 Python 3.7+ 中,虽然字典保留插入顺序,但集合仍保持无序特性。

2. 哪些类型不能作为集合元素?

可变类型(如列表、字典)的元素都是不可哈希的,因此这些类型都是不能作为集合元素。而数字、字符串、元组(仅当元素全不可变)等类型是可哈希的,因此这些类型都是可以作为集合元素。

3. 如何保持去重后的顺序?

在 Python 3.7+ 中,我们可以使用字典保持顺序,比如:

lst = [3, 1, 2, 3, 4, 2]
ordered_unique = list(dict.fromkeys(lst))      # [3, 1, 2, 4]

上一篇: dict()

下一篇: frozenset()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号