python-集合

Posted 夏晓旭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-集合相关的知识,希望对你有一定的参考价值。

 

集合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‘

>>> 

以上是关于python-集合的主要内容,如果未能解决你的问题,请参考以下文章

python-- 集合

Python 学习笔记Python集合

python-集合

Python_00_Python的集合

Python 学习笔记Python集合

Python--集合类型及操作