集合
1.创建集合
2.集合可存储的类型
3.set的增加
>>> s=set("abc")
>>> s.add("111")
>>> s
set(['a', 'c', 'b', '111'])
>>> s.update("qqq")
>>> s
set(['a', 'q', 'c', 'b', '111']) #存进去3个q,会自动去重。
4.集合的删除
>>> s.remove("a")
>>> s
set(['q', 'c', 'b', '111'])
>>> s.remove("z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'z' #删除不存在的元素时,会抛出异常
小练习:捕获删除不存在元素时抛出的异常
#coding = utf-8
s=set('hello')
print u"删除前的集合:",s
try:
s.remove('h')
except KeyError,e:
print u"集合中不存在该元素"
except:
else:
print u"删除成功"
小练习:把set中的111替换成xyz->思路:先删除再添加
>>> s
set(['q', 'c', 'b', '111'])
>>> s.remove('111')
>>> s
set(['q', 'c', 'b'])
>>> s.add('xyz')
>>> s
set(['c', 'b', 'xyz', 'q'])
利用discard删除集合中的元素,不存在时也不会报异常
>>> s
set(['c', 'b', 'xyz', 'q'])
>>> s.discard("c")
>>> s
set(['b', 'xyz', 'q'])
>>> s
set(['b', 'xyz', 'q'])
5.遍历集合
>>> s
set(['c', 'b', 'xyz', 'q'])
>>> for i in s:
... print i
...
c
b
xyz
q
>>>
>>> s
set(['c', 'b', 'xyz', 'q'])
>>> for index,i in enumerate(s):
... print index,i
...
0 c
1 b
2 xyz
3 q
6.将集合转换为list,tuple,str
>>> s
set(['c', 'b', 'xyz', 'q'])
>>> list(s)
['c', 'b', 'xyz', 'q']
强制类型转换
也可以遍历set存到list里面去
#set转换成tuple
>>> tuple(set(s))
('q', 'c', 'b', 'xyz')
#set转换成str
>>> str(set(s))
"set(['q', 'c', 'b', 'xyz'])" #直接强转是不行的
>>> s
set(['c', 'b', 'xyz', 'q']) #用join可以
>>> "".join(s)
'cbxyzq'
#set不能转成字典
>>> dict(set(s))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is requ
拓展:生成字典的一个方法
>>> zip(['one','two','three'],['1','2','3'])
[('one', '1'), ('two', '2'), ('three', '3')]
7.pop函数
>>> s
set(['a', 'm', '111', 'v', 'z'])
>>> s
set(['a', 'm', '111', 'v', 'z'])
>>> s
set(['a', 'm', '111', 'v', 'z'])
>>> s.pop()
'a'
>>> s
set(['m', '111', 'v', 'z'])
>>> s.pop()
'm'
>>> s
set(['111', 'v', 'z'])
弹出第一个元素并删除
小练习:删除set中的最后一个元素
>>> s
set(['111', 'v', 'z'])
>>> j=0
>>> for i in s:
... if j==len(s)-1:
... value=i
... j+=1
...
>>> value
'z'
>>> s.remove(value)
>>> s
set(['111', 'v'])
同学写的封装起来的:
def pop_index(s,num):
'''
1.删除集合中特定位置的值
2.位置从1开始
'''
if num==0:
return '位置需要从1开始'
elif num>len(s):
return '长度不足,删除错误'
else:
for index,x in enumerate(s):
if num==index+1:
value=x
s.remove(value)
return s
ss=set(['c', 'b', 'e', 'q', 'w', 'hg'])
print pop_index(ss, 9)
拓展:面试题,关键字驱动
动作 要操作的对象 操作的值 -> 内部函数的执行
8. 集合的clear,copy和len函数
>>> s
set(['sss', 'aat', 's', '111', 'v'])
>>> s.clear()
>>> s
set([])
>>> s.update('a','b','c','g')
>>> s2=s.copy()
>>> s2
set(['a', 'c', 'b', 'g'])
>>> id(s)
40871976L
>>> id(s2)
40872424L
>>> len(s)
4
>>> len(s2)
4
9.集合的交集、并集、和差集
>>> s2.add('e')
>>> s2.update('5','6')
>>> s2
set(['a', 'c', 'b', 'e', 'g', '5', '6'])
>>> s
set(['a', 'c', 'b', 'g'])
>>> set(s)&set(s2)
set(['a', 'c', 'b', 'g'])
>>> s|s2
set(['a', 'c', 'b', 'e', 'g', '5', '6'])
>>> s&s2
set(['a', 'c', 'b', 'g'])
>>> s-s2
set([])
>>> s2-s
set(['5', 'e', '6'])
差集是有方向的,比较的是第一个集合比第二个集合中多的元素
也可以用单词直接
>>> s.intersection(d)
set(['c', 'd'])
>>> s.union(d)
set(['a', 'c', 'b', 'e', 'd', 'f'])
>>> s.difference(d)
set(['a', 'b'])
10.运算符比较集合间的关系
本质:计算的是两个集合是否为包含或被包含的关系
>>> s==s2
False
>>> s>s2
False
>>> s<s2
True
>>> s>=s2
False
>>> s<=s2
True
>>> s
set(['a', 'c', 'b', 'g'])
>>> s2
set(['a', 'c', 'b', 'e', 'g', '5', '6'])
>>> s!=s2
True
>>> s2.issuperset(s) 超集 s2完全包含s
True
>>> s.issubset(s2) 子集 s完全包含s2
True
11.不可变集合
>>> s3=frozenset('python')
>>> s3
frozenset(['h', 'o', 'n', 'p', 't', 'y'])
>>> type(frozenset)
<type 'type'>
>>> type(s3)
<type 'frozenset'>
>>> s3.add('a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add' #不可变操作时会报错