Python内部库支持的最后一种卧槽类型了……写完了明儿给自己放半天假。
集合综述
Python的集合是一种非常拟合于数学中“集合”概念的数据结构,或者说,它是原教旨主义的集合,它是一种由若干个元素构成的整体,可以理解为一个只有Key的字典或者一个没顺序的列表——从我烂到一定程度的表述就可以看得出,Python的卧槽类型(不算String的话)各有各的特点,在使用的时候要注意区分其中的区别;
之所以说是原教旨主义的集合,是说它的操作方法更偏重于集合之间的逻辑关系。
集合的创建与删除
Set = {elem1, elem2, elem3……}
和字典一样,集合也是由{}
包裹的,元素之间用,
分隔,集合元素与字典的索引一样,要求可Hash(注1);因为和字典的创建有相似之处,如果用Set = {}
的话,就会创建一个字典,所以确实要建空集合的话,必须用构造函数set()
如下创建EmptySet = set()
;
删除一个集合就和删除所有卧槽类型一样,直接del
就好了;
清空一个集合也和所有卧槽类型一样,Set.Clear()
;
如果要删掉单个元素,可以用Set.remove(elem)
删除那个elem元素,但如果elem不存在于这个集合之中,Python会报错,至于防止报错的做法,无非也是用is检查一下下;
集合元素的增加可以用add()
,但不是像LIst一样加在尾部(废话,无序的哪有尾部???)
集合的基本操作
集合由于其特殊的特性,即没有数字索引,又没有Key-Value对应,所以很少访问单个元素,而经常做的是(用for语句)遍历集合;
for id in SetofId :
print(“id is “,id)
如果大家试一下这样的操作,就会发现顺序会错乱,这也像字典一样是Hash的结果;
集合的数学运算
集合的数学运算偏重于逻辑的而非算数的,也就是所说的“交并补”;
操作名 | 对应 | 含义 | 备注 |
---|---|---|---|
联合 | 对应“并” | 把两个集合合二为一 | 当然元素还是不会重复的 |
交集&
|
对应“交” | 把两个集合的公共元素筛选出来 | 你猜这种操作可以干什么? |
补集-
|
对应“补” | 用只存在于集合2却不存在于集合1的元素筛选出来 | |
异或^
|
对应“异或” | 把只属于自己集合的元素筛选出来 | 离散里叫什么来着…… |
联合的写法是|
,但是MarkDown里在单元格里输入这个字符会把单元格分割,所以单独列出来……
不可变集合
有时候大家喜欢集合的访问速度又不希望改变集合内容,就可以用不可变集合;
用frozenset()
函数创建,举例如下:
Seta = frozenset({elem1, elem2})
不可变集合如果被尝试修改(或者尝试清空),不会仅仅修改失败而已,而会抛出错误,所以要谨慎使用;
注1:哈希(Hash)
Hash是一种方法,用来在序列元素与序列索引之间建立对应关系,这样在访问时候就可以把访问的元素带入已经预设的哈希函数,直接求出元素的位置(或者大大缩减检查次数);
这样形成的对应关系如果列出表格,就形成了一张Hash表;
Hash表的冲突解决方案一直是数据结构的重点,现在一般方法是如果所在的索引已经有值(有可能是哈希值重复或者已经被占位),会把元素往后排,一直到有空位为止,另一种方法是同样哈希值的元素放在一个“桶”里;
Hash表可以理解成构造一个函数,比方说用某个人的名字对应他的宿舍号,这样每次我们看到这个人的名字时,只要没忘了这个对应关系(哈希函数),就可以、掐指一算而推知他的宿舍号,大概如此;
网友评论