集合set是Python中一种基本数据类型,它分为可变集合(set)和不可变集合(frozenset)两种。类似于其他语言,集合是一个无序不重复元素集,包括创建集合set、向集合中添加元素、删除集合中的元素、求集合的交集、并集、差集等操作。
可变集合
set集合类需要的参数必须是迭代器类型的,如:序列、字典等,然后转换成无序不重复的元素集。由于集合是不重复的,所以可以对字符串、列表、元组进行去重操作。
>>> set((1,2,3,4))
set([1, 2, 3, 4])
>>> a=[‘a‘,‘b‘]
>>> b=[‘b‘,‘c‘]
>>> set(a+b)
set([‘a‘, ‘c‘, ‘b‘])
>>> set([‘a‘, ‘c‘, ‘b‘])
set([‘a‘, ‘c‘, ‘b‘])
>>> set((1,2,3,4,4,4))
set([1, 2, 3, 4])
不可变集合
集合中的元素不可以被改变,不能做插入和删除操作,其他方法和可变集合基本相同。
>>> frozenset([1,2])
frozenset([1, 2])
可以生成空集合
>>> set([])
set([])
>>> set(())
set([])
set("sabd")传字符串给set,会被拆开
>>> set("abvcd")
set([‘a‘, ‘c‘, ‘b‘, ‘d‘, ‘v‘])
增加
a.add("ab")增加,字符串不会拆开
>>> a=set()
>>> a
set([])
>>> a.add("bb")
>>> a
set([‘bb‘])
>>> a.add("cc")
>>> a
set([‘cc‘, ‘bb‘])
>>>
a.update("cd")update中的字符串会被拆开成单独的元素
>>> a
set([‘cc‘, ‘bb‘])
>>> a.update("cd")
>>> a
set([‘cc‘, ‘c‘, ‘d‘, ‘bb‘])
>>>
元祖不可以加可变元素,列表。、。。
>>> a.add([1,2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: ‘list‘
remove()删除集合元素
>>> a
set([‘a‘, ‘c‘, ‘b‘, ‘d‘, ‘bb‘, ‘cc‘, 13, 14, (2, 3)])
>>> a.remove((2,3))
>>> a
set([‘a‘, ‘c‘, ‘b‘, ‘d‘, ‘bb‘, ‘cc‘, 13, 14])
#encoding=utf-8
s=set(‘hello‘)
print u"删除前的集合:",s
try:
s.remove(‘h‘)
except KeyError,e:
print u"集合中不存在该元素!"
else:
print u"集合中元素删除成功!"
print u"删除某元素后的集合:",s
c:\Python27\Scripts>python task_test.py
删除前的集合: set([‘h‘, ‘e‘, ‘l‘, ‘o‘])
集合中元素删除成功!
删除某元素后的集合: set([‘e‘, ‘l‘, ‘o‘])
del a 删除整个集合
>>> a=set(range(5))
>>> a
set([0, 1, 2, 3, 4])
>>> del a
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ‘a‘ is not defined
集合遍历
>>> a=set(range(5))
>>> a
set([0, 1, 2, 3, 4])
>>> for i in a:
... print i
...
0
1
2
3
4
enumerate(集合)
#encoding=utf-8
sTest=set([‘a‘,‘b‘,‘c‘,‘d‘,‘1‘,‘2‘,‘3‘])
print u"集合为:",sTest
for index,elem in enumerate(sTest):
print u"元素的索引号为:", index,u"对应的元素为:",elem
c:\Python27\Scripts>python task_test.py
集合为: set([‘a‘, ‘c‘, ‘b‘, ‘d‘, ‘1‘, ‘3‘, ‘2‘])
元素的索引号为: 0 对应的元素为: a
元素的索引号为: 1 对应的元素为: c
元素的索引号为: 2 对应的元素为: b
元素的索引号为: 3 对应的元素为: d
元素的索引号为: 4 对应的元素为: 1
元素的索引号为: 5 对应的元素为: 3
元素的索引号为: 6 对应的元素为: 2
>>> for index,elem in enumerate(a):
... print index, elem
...
0 a
1 d
2 f
3 i
4 k
5 j
6 s
集合和列表,元组之间互相转换
集合和序列之间的转换跟序列之间互转是一样的,唯一不同的就是序列转成集合后,重复的元素被去掉了
集合转字符串时,直接使用str()函数进行转换,得到的将是集合的字符串形式。要想真正转成字符串,我们需要借助字符串连接函数join()函数来完成。
>>> a=set(list("sdfsadf"))
>>> a
set([‘a‘, ‘s‘, ‘d‘, ‘f‘])
>>> a=list("askldjf")
>>> a
[‘a‘, ‘s‘, ‘k‘, ‘l‘, ‘d‘, ‘j‘, ‘f‘]
>>> set(a)
set([‘a‘, ‘d‘, ‘f‘, ‘k‘, ‘j‘, ‘l‘, ‘s‘])
>>> list(set(a))
[‘a‘, ‘d‘, ‘f‘, ‘k‘, ‘j‘, ‘l‘, ‘s‘]
>>> a
[‘a‘, ‘s‘, ‘k‘, ‘l‘, ‘d‘, ‘j‘, ‘f‘]
>>> "".join(list(set(a)))
‘adfkjls‘
>>> tuple(set(a))
(‘a‘, ‘d‘, ‘f‘, ‘k‘, ‘j‘, ‘l‘, ‘s‘)
>>> set(tuple(set(a)))
set([‘a‘, ‘d‘, ‘f‘, ‘k‘, ‘j‘, ‘l‘, ‘s‘])
>>>
a.discard()删除集合中元素
>>> a=set(a)
>>> a
set([‘a‘, ‘d‘, ‘f‘, ‘k‘, ‘j‘, ‘l‘, ‘s‘])
>>> a.discard(‘a‘)
>>> a
set([‘d‘, ‘f‘, ‘k‘, ‘j‘, ‘l‘, ‘s‘])
a.pop()删除集合的第一个值
函数原型: s.pop() 参数说明: s:为set类型的变量 函数作用: 删除并返回集合s中的第一个元素,如果为空引发KeyError错误
>>> a
set([‘f‘, ‘k‘, ‘j‘, ‘l‘, ‘s‘])
>>> a.pop()
‘f‘
>>> a.pop()
‘k‘
>>> a.pop()
‘j‘
>>> a.pop()
‘l‘
>>> a.pop()
‘s‘
a.copy拷贝
>>> a=set(list("sadfsadf"))
>>> a
set([‘a‘, ‘s‘, ‘d‘, ‘f‘])
>>> b=a.copy()
>>> b
set([‘a‘, ‘s‘, ‘d‘, ‘f‘])
>>> id(a)
50435464L
>>> id(b)
50260008L
>>> a.remove(‘a‘)
>>> a
set([‘s‘, ‘d‘, ‘f‘])
>>> b
set([‘a‘, ‘s‘, ‘d‘, ‘f‘])
>>> a.clear()
>>> a
set([])
>>> b
set([‘a‘, ‘s‘, ‘d‘, ‘f‘])
变量a和b都指向5这个数的地址,把a赋值2,a指向了2的地址,a的地址就变了,b还是指向5这个地址
列表a,b再相同的场景下,执行的地址相同,且不会变,一个做了改变,另一个也变,因为地址还是一个地址
>>> a=5
>>> b=a
>>> b
5
>>> id(a)
44195672L
>>> id(b)
44195672L
>>> a=2
>>> b
5
>>> a
[‘a‘, ‘s‘, ‘d‘, ‘f‘]
>>> b=a
>>> b
[‘a‘, ‘s‘, ‘d‘, ‘f‘]
>>> a
[‘a‘, ‘s‘, ‘d‘, ‘f‘]
>>> id(a)
51080328L
>>> id(b)
51080328L
>>> a+[‘sd‘]
[‘a‘, ‘s‘, ‘d‘, ‘f‘, ‘sd‘]
>>> id(a)
51080328L
a. clear()清空len(a)长度
>>> b
set([‘a‘, ‘s‘, ‘d‘, ‘f‘])
>>> len(b)
4
>>> b.clear()
>>> b
set([])
>>>
集合交集&、并集|、差集-
>>> a
set([4, 5, 6, 7])
>>> b
set([3, 4, 5])
>>> a&b
set([4, 5])
>>> a|b
set([3, 4, 5, 6, 7])
>>> a-b
set([6, 7])
a.difference(b)在集合a中,不在集合b中的元素
查看两个集合的不同之处,使用的difference函数,等价于差集。如: s1.difference(s2) 这种不同指的是集合s1相对于集合s2,不同的地方,也就是所有在集合s1中,而不再集合s2中的的元素组成的新集合。
>>> a
set([4, 5, 6, 7])
>>> b
set([3, 4, 5])
>>> a.difference(b)
set([6, 7])
>>> a-b
set([6, 7])
补集=全集-子集
集合操作—运算符判断集合间关系
集合可以使用大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)来判断某个集合是否完全包含于另一个集合,也可以使用子父集判断函数。
有如下三个集合:
>>> a
set([4, 5, 6, 7])
>>> b
set([3, 4, 5])
>>> a>b
False
>>> a<b
False
>>> a==b
False
>>> a=set(range(5))
>>> a
set([0, 1, 2, 3, 4])
>>> b=set(range(3))
>>> b
set([0, 1, 2])
>>> a
set([0, 1, 2, 3, 4])
>>> a>b
True
>>> a<b
False
>>> a==b
False
a.issuperset(b), issuperset方法所用是判断集合st1是否是集合st2的父集,如果是返回True,否则返回False。
a.issubset(b)判断a是否是b的子集
>>> a
set([0, 1, 2, 3, 4])
>>> b
set([0, 1, 2])
>>> a.issuperset(b)
True
>>> b.issuperset(a)
False
>>> b.issubset(a)
True
>>> a.issubset(a)
True
>>> a.issubset(b)
False
>>>
集合里也可以使用成员运算符,in和not in,判断某个对象是否是集合中的成员。
>>> a
set([0, 1, 2, 3, 4])
>>> b
set([0, 1, 2])
>>> b in a
False
>>> a in b
False
>>> 0 in a
True
>>> 1 in a
True
集合操作—不可变集合
Python中还有一种不可改变的集合,那就是 frozenset,不像set集合,可以增加删除集合中的元素,该集合中的内容是不可改变的,类似于字符串、元组。如果试图改变不可变集合中的元素,就会报AttributeError错误。
不可变集合,除了内容不能更改外,其他功能及操作跟可变集合set一样,不在赘述
>>> f1=frozenset(‘python‘)
>>> f1
frozenset([‘h‘, ‘o‘, ‘n‘, ‘p‘, ‘t‘, ‘y‘])
>>> f1.add("a")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘frozenset‘ object has no attribute ‘add‘
>>> f1.update("a")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘frozenset‘ object has no attribute ‘update‘
>>>