您的位置:首页 > 其它

day①:集合

2015-12-29 17:01 274 查看
集合

python的set和其它语言类似,是一个无序不重复元素集,基本功能包括关系测试和消除重复元素,集合对象还支持union(联合),intersection(交),difference(差)和sysmmetricdifference(对称差集)等数学运算。

优点:

  访问速度快

  天生解决了重复问题

 

例子:

>>>s=set([1,2,3,4])#创建一个数值集合
>>>s
set([1,2,3,4])
>>>t=set("Hello")#创建一个唯一字符的集合
与列表和元组不同,集合是无序的,也无法通过数字进行索引,而且集合里面的元素不能重复
>>>t
set(['H','e','l','o'])#发现只出现了一个l
>>>a=t|s#t和s的并集
>>>a
set([1,2,3,'e','H','l','o',4])
>>>b=t&s#t和s的交集
>>>b
set([])
>>>c=t-s#求差集(在t,不在s)
>>>c
set(['H','e','l','o'])
>>>d=t^s#对称差集(在t或s中,但不会同事出现在二者中)
>>>d
set([1,2,3,4,'H','l','o','e'])
>>>t
set(['H','e','l','o'])

###基本操作
>>>t.add('a')#添加一项
>>>t
set(['a','H','e','l','o'])
>>>s
set([1,2,3,4])
>>>s.update([90,34,53])#在s中添加多项
>>>s
set([1,34,3,4,2,53,90])
>>>t
set(['a','H','e','l','o'])
>>>t.remove('e')#删除
>>>t
set(['a','H','l','o'])
>>>len(s)#set的长度
7
>>>len(t)#set的长度
4
>>>53ins#测试x是否是s的成员
True
>>>2ins#测试x是否是s的成员
True
>>>20ins#测试x是否不是s的成员
False
>>>s.discard(90)#如果set中存在“90”元素,则删除
>>>s
set([1,34,3,4,2,53])
>>>s.pop()#删除并且返回集合中一个不确定的元素,如果集合空,则引发KeyError
1
>>>s
set([34,3,4,2,53])
>>>s.pop()
34
>>>s
set([3,4,2,53])
>>>s.pop()
3
>>>s
set([4,2,53])
>>>s.pop()
4
>>>s
set([2,53])
##为啥我测试每次都是删第一个元素的呢?

>>>s.clear()#删除集合里的所有元素
>>>s
set([])
>>>s=set([1,34,3,4,2,53,90])
>>>s
set([1,34,3,4,2,53,90])
>>>t
set(['a','H','l','o'])
>>>s<=t#测试是否s中的每一个元素都在t中(s.issubset(t))
False
>>>s>=t#测试是否t中的每一个元素都在s中(s.issuperset(t))
False
>>>s.union(t)#返回一个新的set,包含s和t中的每一个元素(s|t)
set(['a',1,34,3,4,'H',2,'o','l',53,90])
>>>s.intersection(t)#返回一个新的set,包含s和t中的公共元素(s&t)
set([])
>>>s.difference(t)#返回一个新的set,包含s中有但是t中没有的元素(s-t)
set([1,34,3,4,2,53,90])
>>>s.symmetric_difference(t)#返回一个新的set,包含s和t中不重复的元素(s^t)
set(['a',1,34,3,4,'H',2,'l','o',53,90])
>>>new_set=s.copy#返回set的一个浅复制
>>>new_set
<built-inmethodcopyofsetobjectat0x7ffe1dab7ed0>


稍稍记住:

 s.union(t)=s|t:s和t的并集

 s.intersection(t)=s&t:s和t的交集

 s.difference(t)=s-t:差集(在s,不在t)

 s.symmetric_difference(t)=s^t:对称差集(在t或s中,但不会同时出现在二者中,包含s和t中不重复的元素)

  

二.某些方法例子:

(1)difference、difference_update

defdifference(self,*args,**kwargs):#realsignatureunknown
"""
Returnthedifferenceoftwoormoresetsasanewset.

(i.e.allelementsthatareinthissetbutnottheothers.)
"""
pass

defdifference_update(self,*args,**kwargs):#realsignatureunknown

"""删除当前set中的所有包含在newset里的元素"""
"""Removeallelementsofanothersetfromthisset."""
pass


例子:

>>>s1
set(['hy','alex','yaobin'])
>>>s2
set(['test2','hehe','hy','alex','yaobin'])
>>>s4=s2.difference(s1)
>>>s1
set(['hy','alex','yaobin'])
>>>s2
set(['test2','hehe','hy','alex','yaobin'])
>>>s4#生成一个新的集合!
set(['test2','hehe'])
>>>
>>>
>>>s1
set(['hy','alex','yaobin'])
>>>s2
set(['test2','hehe','hy','alex','yaobin'])
>>>s5=s2.difference_update(s1)
>>>s1
set(['hy','alex','yaobin'])
>>>s2#把s1存在s2的元素清了!
set(['test2','hehe'])
>>>s5#没有生成新的集合!
>>>prints5
None


(2)intersection、intersection_update

defintersection(self,*args,**kwargs):#realsignatureunknown
"""取交集,新创建一个set"""
"""
Returntheintersectionoftwoormoresetsasanewset.

(i.e.elementsthatarecommontoallofthesets.)
"""
pass

defintersection_update(self,*args,**kwargs):#realsignatureunknown
"""取交集,修改原来set"""
"""Updateasetwiththeintersectionofitselfandanother."""
pass


例子:

>>>s1
set(['hy','alex','yaobin'])
>>>s2
set(['alex','hy','test2','hehe','yaobin'])
>>>s3=s2.intersection(s1)
>>>s3#生成一个新的集合
set(['hy','alex','yaobin'])
>>>
>>>
>>>s1
set(['hy','alex','yaobin'])
>>>s2
set(['alex','hy','test2','hehe','yaobin'])
>>>s4=s2.intersection_update(s1)
>>>s4
>>>prints4#没有生成一个新的集合
None
>>>s1
set(['hy','alex','yaobin'])
>>>s2#修改s2去了!
set(['hy','alex','yaobin'])


(3)isdisjoint

  

defisdisjoint(self,*args,**kwargs):#realsignatureunknown
"""如果没有交集,返回true"""
"""ReturnTrueiftwosetshaveanullintersection."""
pass

例子:
  


>>>s1
set(['hy','alex','yaobin'])
>>>s2
set(['hy','alex','yaobin'])
>>>s1.isdisjoint(s2)
False

>>>s2=set(['a','b','c'])
>>>s1.isdisjoint(s2)
True


(4)issubset、issuperset

defissubset(self,*args,**kwargs):#realsignatureunknown
"""是否是子集"""
"""Reportwhetheranothersetcontainsthisset."""
pass

defissuperset(self,*args,**kwargs):#realsignatureunknown
"""是否是父集"""
"""Reportwhetherthissetcontainsanotherset."""
pass


例子:

>>>s1
set(['hy','alex','yaobin'])
>>>s2
set(['haha','hy','alex','hehe','yaobin'])
>>>s1.issubset(s2)
True
>>>
>>>
>>>s2.issuperset(s1)
True


(5)pop、remove

defpop(self,*args,**kwargs):#realsignatureunknown
"""移除"""
"""
Removeandreturnanarbitrarysetelement.
RaisesKeyErrorifthesetisempty.
"""
pass

defremove(self,*args,**kwargs):#realsignatureunknown
"""移除"""
"""
Removeanelementfromaset;itmustbeamember.

Iftheelementisnotamember,raiseaKeyError.
"""
pass

例子:
 


>>>s1
set(['hy','alex','yaobin'])
>>>s2
set(['haha','hy','alex','hehe','yaobin'])
>>>s2.pop()#pop可以拿一个元素,可以赋值给你定义的xxx
'haha'
>>>s2
set(['hy','alex','hehe','yaobin'])

>>>s2.remove()
Traceback(mostrecentcalllast):
File"<stdin>",line1,in<module>
TypeError:remove()takesexactlyoneargument(0given)
>>>s2.remove('hy')#要指定元素
>>>s2
set(['alex','hehe','yaobin'])


(6)symmetric_difference、symmetric_difference_update


  defsymmetric_difference(self,*args,**kwargs):#realsignatureunknown
"""对称差集,创建新对象"""
"""
Returnthesymmetricdifferenceoftwosetsasanewset.

(i.e.allelementsthatareinexactlyoneofthesets.)
"""
pass

defsymmetric_difference_update(self,*args,**kwargs):#realsignatureunknown
"""对称差集,改变原来"""
"""Updateasetwiththesymmetricdifferenceofitselfandanother."""
pass


例子:

 

>>>s1
set(['hehe','hy','alex'])
>>>s2
set(['hehe','yaobin'])
>>>s2.symmetric_difference(s1)
set(['alex','hy','yaobin'])
>>>s1
set(['hehe','hy','alex'])
>>>s2#没变
set(['hehe','yaobin'])
>>>
>>>
>>>s2.symmetric_difference_update(s1)
>>>s1
set(['hehe','hy','alex'])
>>>s2#变了
set(['hy','alex','yaobin'])
>>>


(7)difference、symetric_difference

  

defdifference(self,*args,**kwargs):#realsignatureunknown
"""
Returnthedifferenceoftwoormoresetsasanewset.

(i.e.allelementsthatareinthissetbutnottheothers.)
"""
pass

defsymmetric_difference(self,*args,**kwargs):#realsignatureunknown
"""对称差集,创建新对象"""
"""
Returnthesymmetricdifferenceoftwosetsasanewset.

(i.e.allelementsthatareinexactlyoneofthesets.)
"""
pass


例子:

  

s1=set([11,22,33])
s2=set([22,44])

ret1=s1.difference(s2)
ret2=s1.symmetric_difference(s2)

printret1
printret2

结果:
set([33,11])
set([33,11,44])

解析:
可以理解为:ret1,先循环s1,判断不在s2的
ret2,先循环s1,判断不在s2的,后循环s2,判断不在s1的


end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: