集合set

集合set

集合,简称集。由任意个元素构成的集体。高级语言都实现了这个非常重要的数据结构类型。Python中,它是可变的、无序的、不重复的元素的集合。

初始化

Init signature: set(self, /, *args, **kwargs)
Docstring:     
set() -> new empty set object
set(iterable) -> new set object

Build an unordered collection of unique elements.
Type:           type
Subclasses:     Set, Set, Set
s1 = set()
s2 = set(range(5))
s3 = set([1, 2, 3])
s4 = set('abcdabcd')
s5 = {} # 这是什么?
s6 = {1, 2, 3}
s7 = {1, (1,)}
s8 = {1, (1,), [1]} # ?

元素性质

  • 去重:在集合中,所有元素必须相异
  • 无序:因为无序,所以不可索引
  • 可哈希:Python集合中的元素必须可以hash,即元素都可以使用内建函数hash
  • 目前学过的不可hash的类型有:list、set、bytearray
  • 可迭代:set中虽然元素不一样,但元素都可以迭代出来。

增加

  • add(elem)

增加一个元素到set中

如果元素存在,什么都不做

  • update(*others)

合并其他元素到set集合中

参数others必须是可迭代对象

就地修改

s = set()
s.add(1) 
s.update((1,2,3), [2,3,4])

 删除

  • remove(elem)
  • discard(elem)
  • pop()->item
  • clear()

 修改

集合类型没有修改。因为元素唯一。如果元素能够加入到集合中,说明它和别的元素不一样。所谓修改,其实就是把当前元素修改成一个完全不同的元素,就是删除加入新元素。

遍历

只要是容器,都可以遍历元素。但是效率都是O(n)。

成员运算符in

print(10 in [1, 2, 3])
print(10 in {1, 2, 3})

 上面2行代码,分别在列表和集合中搜索元素。如果列表和集合的元素都有100万个,谁的效率高?

 

IPython魔术方法

Ipython内置的特殊方法,使用%百分号开头的

% 开头是line magic

%%开头是cell magic,notebook的cell

%timeit statemen
-n 一个循环loop执行语句多少次
-r 循环执行多少次loop,取得最好的结果

%%timeit setup_code

#下面写一行,列表每次都要创建,这样写不好
%timeit(-1 in list(range(100)))

# 下面写一个cell中,写在setup中,列表创建一次
%%timeit l=list(range(1000000)
-1 in l

 

结果说明,集合性能很好。为什么?

  • 线性数据结构,搜索元素的时间复杂度是O(n),随着数据规模增加耗时增大
  • set、dict使用hash表实现,内部使用hash值作为key,时间复杂度为o(1),查询时间和数据规模无关,不会随着数据规模增大而搜索性能下降。

 可哈希

  • 数值型int、float、complex
  • 布尔型True、False
  • 字符串 string、bytes
  • tuple
  • None
  • 以上都是不可变类型,称为可哈希类型

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值