集合(set)
回顾
在之前学习的数据类型中:
能够索引的,如list/str,其中的元素可以重复
可变的,如list/dict,即其中的元素/键值对可以原地修改
不可变的,如str/int,即不能进行原地修改
无索引序列的,如dict,即其中的元素(键值对)没有排列顺序
现在要介绍另外一种类型的数据,英文是set,翻译过来叫做“集合”。它的特点是:有的可变,有的不可变;元素无次序,不可重复。
创建set
set是无序的,不可重复,可以原处修改的数据类型
使用set创建
1 2
| set1 = set("carll") print "set1 is " + str(set1)
|
通过set创建,’l’只有一个,并且元素顺序被打乱
使用frozenset创建
1 2 3
| fset = frozenset("carl") print fset
|
set 创建的集合是可以原处修改的
frozenset 创建的集合是不可以原处修改的
使用 “{}” 创建
1 2
| set2 = {"hello","world",123,"!","!"} print "set2 is " + str(set2)
|
使用{}创建,不建议使用,python有时会分不清是set还是dict
集合和列表装换
list() 和 set() 可以实现两种数据互相转换
1 2 3 4 5
| alis = list(set1) alis.append("l") print alis set3 = set(alis) print set3
|
可以发现,转换成集合以后,就没有重复的元素了
集合的方法
增加(add、uodate)
1 2 3 4
| set3.add("hello") print set3 set3.update(set2) print set3
|
add添加一个元素
update合并一个集合
删除(pop、remove、discard)
1 2 3 4 5
| print set3.pop() print set3.remove("hello") print set3 print set3.discard("world") print set3
|
pop,任意删除并返回删除的元素,不能指定元素,set为空将报错
remove,返回None证明remove无返回 如果元素不存在则报错
discard,返回None证明discard无返回,如果元素存在就删除,如果不在就什么也不做
清空(clear)
clear,清空集合
集合运算
判断元素是否属于集合(in)
1 2
| print "c in fset?\t" + str("c" in fset) print "d in fset?\t" + str("d" in fset)
|
判断是否为子集或超集(<、issubset;>、issuperset)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| print "set3 是 fset的子集?\t" + str(set3 < fset) print "set3 是 fset的子集?\t" + str(set3.issubset(fset)) print "set3 是 fset的超集?\t" + str(set3 > fset) print "set3 是 fset的超集?\t" + str(set3.issuperset(fset)) ```
```python set3.add("a") set3.add("r") print "set3 == fset?\t" + str(set3 == fset) set3.add("l") print "set3 != fset?\t" + str(set3 != fset) ```
```python set4 = set3 | set2 print set4 set4.clear() set4 = set3.union(set1) print set4
|
两集合的交集(&、intersection)
1 2
| print set4 & set3 print set4.intersection(set3)
|
差(-、difference)
前集合相对后集合不同的地方
1 2
| print set2 - set4 print set2.difference(set4)
|
对称差(symmetric_difference)
并集之外的元素
1 2 3
| print "set3 is\t" + str(set3) print "set2 is\t" + str(set2) print set3.symmetric_difference(set2)
|