Python学习笔记(十)—— Set

本文介绍了Python中Set的数据结构及其在去除重复元素、集合运算等方面的应用。通过实例对比展示了使用Set进行集合运算相较于传统方法的优势,并提供了创建Set及FrozenSet的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码及内容源自《Fluent Python》——Luciano Ramalho 著

set 是一个不重复元素的集合,它的一个基本的应用就是去除重复:

>>> l = ['spam','spam','eggs','spam']
>>> set(l)
{'eggs', 'spam'}
>>> list(set(l))
['eggs', 'spam']

set支持集合的基本操作,如 a | b返回并集,a & b返回交集,a - b返回差集。有效利用set的集合运算,能够帮助缩短代码,提高可读性。

例如,现在有一个较大的email地址集(haystack)和一个较小的地址集(needles),我们需要统计needles中有多少也属于haystack。由于有了set,我们可以用一行简单的代码来实现这个目的:

found = len(set(needles) & set(haystack))

作为比较,如果不用集合运算,而用通常的方法,则代码如下:

found = 0
for n in needles:
    for n in haystack:
        found += 1

在Python3中,set的标准字符串表达形式为{…},但是空集表示为set():

>>> s = {1}
>>> type(s)
set
>>> s
{1}
>>> s.pop()
1
>>> s
set()

使用如{1,2,3}的方式来创建set,与调用构造函数set([1,2,3])相比,速度更快,可读性更高。因为对后者来说,Python需要先获取set对应的构造函数、再创建一个list,然后把list传递到构造函数当中。而前者只需要调用一个特殊的二进制代码BUILD_SET。

对于frozenset,只能通过调用构造函数来创建:

>>> frozenset(range(10))
frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})

set comprehension在Python 2.7中被加入:

>>> from unicodedata import name
>>> {chr(i) for i in range(32,256) if 'SIGN' in name(chr(i),'')}
{'#','$','%','+','<','=','>','¢','£','¤','¥','§','©','¬','®','°','±','µ','¶','×','÷'}

由于使用了hash table,dict和set的速度很快,键值搜索的效率很高。具体的性能和原因可参见原书p85-p93。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值