python 之 set

python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.

sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作。

下面来点简单的小例子说明把。

x = set(‘spam’)
y = set([‘h’,’a’,’m’])
x, y
(set([‘a’, ‘p’, ‘s’, ‘m’]), set([‘a’, ‘h’, ‘m’]))

再来些小应用。

x & y # 交集
set([‘a’, ‘m’])

x | y # 并集
set([‘a’, ‘p’, ‘s’, ‘h’, ‘m’])

x - y # 差集
set([‘p’, ‘s’])

记得以前个网友提问怎么去除海量列表里重复元素,用hash来解决也行,只不过感觉在性能上不是很高,用set解决还是很不错的,示例如下:

a = [11,22,33,44,11,22]
b = set(a)
b
set([33, 11, 44, 22])
c = [i for i in b]
c
[33, 11, 44, 22]

很酷把,几行就可以搞定。

1.8 集合

集合用于包含一组无序的对象。要创建集合,可使用set()函数并像下面这样提供一系列的项:

s = set([3,5,9,10]) #创建一个数值集合

t = set(“Hello”) #创建一个唯一字符的集合

与列表和元组不同,集合是无序的,也无法通过数字进行索引。此外,集合中的元素不能重复。例如,如果检查前面代码中t集合的值,结果会是:

t

set([‘H’, ‘e’, ‘l’, ‘o’])

注意只出现了一个’l’。

集合支持一系列标准操作,包括并集、交集、差集和对称差集,例如:

a = t | s # t 和 s的并集

b = t & s # t 和 s的交集

c = t – s # 求差集(项在t中,但不在s中)

d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)

基本操作:

t.add(‘x’) # 添加一项

s.update([10,37,42]) # 在s中添加多项

使用remove()可以删除一项:

t.remove(‘H’)

len(s)
set 的长度

x in s
测试 x 是否是 s 的成员

x not in s
测试 x 是否不是 s 的成员

s.issubset(t)
s <= t
测试是否 s 中的每一个元素都在 t 中

s.issuperset(t)
s >= t
测试是否 t 中的每一个元素都在 s 中

s.union(t)
s | t
返回一个新的 set 包含 s 和 t 中的每一个元素

s.intersection(t)
s & t
返回一个新的 set 包含 s 和 t 中的公共元素

s.difference(t)
s - t
返回一个新的 set 包含 s 中有但是 t 中没有的元素

s.symmetric_difference(t)
s ^ t
返回一个新的 set 包含 s 和 t 中不重复的元素

s.copy()
返回 set “s”的一个浅复制

请注意:union(), intersection(), difference() 和 symmetric_difference() 的非运算符(non-operator,就是形如 s.union()这样的)版本将会接受任何 iterable 作为参数。相反,它们的运算符版本(operator based counterparts)要求参数必须是 sets。这样可以避免潜在的错误,如:为了更可读而使用 set(‘abc’) & ‘cbs’ 来替代 set(‘abc’).intersection(‘cbs’)。从 2.3.1 版本中做的更改:以前所有参数都必须是 sets。

另外,Set 和 ImmutableSet 两者都支持 set 与 set 之间的比较。两个 sets 在也只有在这种情况下是相等的:每一个 set 中的元素都是另一个中的元素(二者互为subset)。一个 set 比另一个 set 小,只有在第一个 set 是第二个 set 的 subset 时(是一个 subset,但是并不相等)。一个 set 比另一个 set 打,只有在第一个 set 是第二个 set 的 superset 时(是一个 superset,但是并不相等)。

子 set 和相等比较并不产生完整的排序功能。例如:任意两个 sets 都不相等也不互为子 set,因此以下的运算都会返回 False:a

### Python `set()` 集合元素的无序性 `set()` 是一种内置的数据结构,用于存储唯一的元素集合。重要的是,`set()` 中的元素是没有固定顺序的[^1]。 ```python example_set = {1, 2, 'three', 4} print(example_set) # 输出可能为 {'three', 1, 2, 4} 或其他排列方式 ``` 由于 `set()` 的内部实现基于哈希表,这决定了其无法保持插入顺序。每次打印同一个 `set()` 对象时,可能会得到不同的显示顺序。 #### 处理元素顺序的方法 如果需要维护元素的插入顺序并去除重复项,可以考虑使用 `list()` 结合字典推导式来达到目的: ```python from collections import OrderedDict unordered_data = ['apple', 'banana', 'orange', 'apple', 'pear'] ordered_unique_elements = list(OrderedDict.fromkeys(unordered_data)) print(ordered_unique_elements) # 输出: ['apple', 'banana', 'orange', 'pear'] ``` 另一种更简洁的方式是从 Python 3.7 开始,在标准库中引入了保留插入顺序特性的字典类型,可以直接利用此特性配合集合操作: ```python unique_ordered_items = list(dict.fromkeys(['apple', 'banana', 'orange', 'apple'])) print(unique_ordered_items) # 输出: ['apple', 'banana', 'orange'] ``` 对于某些场景下确实需要有序且唯一元素的情况下,还可以选择使用 `sorted()` 函数对 `set()` 进行排序,从而获得按特定规则排序后的列表形式的结果: ```python unsorted_numbers = {9, 8, 7, 6, 5, 4, 3, 2, 1} sorted_numbers = sorted(unsorted_numbers) print(sorted_numbers) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值