您的当前位置:首页正文

python中的集合(set)详解

2023-11-25 来源:东饰资讯网
python中的集合(set)详解

在Python set是基本数据类型的⼀种集合类型,它有可变集合(set())和不可变集合(frozenset)两种。创建集合set、集合set添加、集合删除、交集、并集、差集的操作都是⾮常实⽤的⽅法。

set 是⼀个⽆序的元素集合,⽀持并、交、差及对称差等数学运算, 但由于 set 不记录元素位置,因此不⽀持索引、分⽚等类序列的操作。tuple算是list和str的杂合(杂交的都有⾃⼰的优势,上⼀节的末后已经显⽰了),那么set则可以堪称是list和dict的杂合.

set拥有类似dict的特点:可以⽤{}花括号来定义;其中的元素没有序列,也就是是⾮序列类型的数据;⽽且,set中的元素不可重复,这就类似dict的键.

set也有⼀点list的特点:有⼀种集合可以原处修改.

⼀:创建集合set:

  python set类是在python的sets模块中,⼤家现在使⽤的python2.3中,不需要导⼊sets模块可以直接创建集合。

  >>>set('boy')  set(['y', 'b', 'o'])

⼆:集合添加、删除

  集合的添加有两种常⽤⽅法,分别是add和update。集合add⽅法:是把要传⼊的元素做为⼀个整个添加到集合中,例如:  

>>> a = set('boy')>>> a.add('python')>>> a

set(['y', 'python', 'b', 'o'])

  集合update⽅法:是把要传⼊的元素拆分,做为个体传⼊到集合中,例如:

>>> a = set('boy')

>>> a.update('python')>>> a

set(['b', 'h', 'o', 'n', 'p', 't', 'y'])

集合删除操作⽅法:remove

set(['y', 'python', 'b', 'o'])>>> a.remove('python')>>> a

set(['y', 'b', 'o'])

set的常⽤⽅法

add, update>>> help(set.add)

Help on method_descriptor:

add(...)

Add an element to a set.

This has no effect if the element is already present.下⾯在交互模式这个最好的实验室⾥⾯做实验:

>>> a_set = {} #我想当然地认为这样也可以建⽴⼀个set

>>> a_set.add(\"qiwsir\") #报错.看看错误信息,居然告诉我dict没有add.我分明建⽴的是set呀.Traceback (most recent call last): File \"\

AttributeError: 'dict' object has no attribute 'add'

>>> type(a_set) #type之后发现,计算机认为我建⽴的是⼀个dict

特别说明⼀下,{}这个东西,在dict和set中都⽤.但是,如上⾯的⽅法建⽴的是dict,不是set.这是python规定的.要建⽴set,只能⽤前⾯介绍的⽅法了.

>>> a_set = {'a','i'} #这回就是set了吧>>> type(a_set)

#果然

>>> a_set.add(\"qiwsir\") #增加⼀个元素

>>> a_set #原处修改,即原来的a_set引⽤对象已经改变

set(['i', 'a', 'qiwsir'])

>>> b_set = set(\"python\")>>> type(b_set)>>> b_set

set(['h', 'o', 'n', 'p', 't', 'y'])>>> b_set.add(\"qiwsir\")>>> b_set

set(['h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])

>>> b_set.add([1,2,3]) #报错.list是不可哈希的,集合中的元素应该是hashable类型。Traceback (most recent call last): File \"\TypeError: unhashable type: 'list'>>> b_set.add('[1,2,3]') #可以这样!>>> b_set

set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])

除了上⾯的增加元素⽅法之外,还能够从另外⼀个set中合并过来元素,⽅法是set.update(s2)

>>> help(set.update)update(...)

Update a set with the union of itself and others.>>> s1set(['a', 'b'])>>> s2

set(['github', 'qiwsir'])

>>> s1.update(s2) #把s2的元素并⼊到s1中.>>> s1 #s1的引⽤对象修改set(['a', 'qiwsir', 'b', 'github'])>>> s2 #s2的未变set(['github', 'qiwsir'])

如果仅仅是这样的操作,容易误以为update⽅法的参数只能是集合。⾮也。看⽂档中的描述,这个⽅法的作⽤是⽤原有的集合⾃⾝和其它的什么东西构成的新集合更新原来的集合。这句话有点长,可以多读⼀遍。分解开来,可以理解为:others是指的作为参数的不可变对象,将它和原来的集合组成新的集合,⽤这个新集合替代原来的集合。举例:

>>> s2.update(\"goo\")>>> s2

set(['github', 'o', 'g', 'qiwsir'])>>> s2.update((2,3))>>> s2

set([2, 3, 'g', 'o', 'github', 'qiwsir'])所以,⽂档的寓意还是⽐较深刻的。pop, remove, discard, clear

>>> help(set.pop)pop(...)

Remove and return an arbitrary set element. Raises KeyError if the set is empty.

>>> b_set

set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])

>>> b_set.pop() #从set中任意选⼀个删除,并返回该值'[1,2,3]'

>>> b_set.pop()'h'

>>> b_set.pop()'o'

>>> b_set

set(['n', 'p', 't', 'qiwsir', 'y'])

>>> b_set.pop(\"n\") #如果要指定删除某个元素,报错了.Traceback (most recent call last): File \"\

TypeError: pop() takes no arguments (1 given)

set.pop()是从set中任意选⼀个元素,删除并将这个值返回.但是,不能指定删除某个元素.报错信息中就告诉我们了,pop()不能有参数.此外,如果set是空的了,也报错.这条是帮助信息告诉我们的,看官可以试试.要删除指定的元素,怎么办?

>>> help(set.remove)

remove(...)

Remove an element from a set; it must be a member. If the element is not a member, raise a KeyError.

set.remove(obj)中的obj,必须是set中的元素,否则就报错.试⼀试:>>> a_set

set(['i', 'a', 'qiwsir'])>>> a_set.remove(\"i\")>>> a_set

set(['a', 'qiwsir'])

>>> a_set.remove(\"w\")

Traceback (most recent call last): File \"\KeyError: 'w'

跟remove(obj)类似的还有⼀个discard(obj):>>> help(set.discard)

discard(...)

Remove an element from a set if it is a member. If the element is not a member, do nothing

与help(set.remove)的信息对⽐,看看有什么不同.discard(obj)中的obj如果是set中的元素,就删除,如果不是,就什么也不做,do nothing.新闻就要对⽐着看才有意思呢.这⾥也⼀样.

>>> a_set.discard('a')>>> a_set set(['qiwsir'])

>>> a_set.discard('b')>>>

在删除上还有⼀个绝杀,就是set.clear(),它的功能是:Remove all elements from this set.(看官⾃⼰在交互模式下help(set.clear))>>> a_setset(['qiwsir'])

>>> a_set.clear()>>> a_setset([])

>>> bool(a_set) #空了,bool⼀下返回False.False

因篇幅问题不能全部显示,请点此查看更多更全内容