python学习笔记:数据类型之集合(set)

  • 集合是指无序且不重复的数据/元素集。
  • 集合具有无序性(unordered),s={1,2,3}仅表示1、2、3在集合s中,三者没有先后顺序。
  • 集合元素唯一性(unique),任意一个集合中不存在两个相同的元素。
  • 集合元素不可更改(immutable)。

一、创建集合

前提知识:

harshable:

An object is hashable if it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __ eq__() or __cmp__()). Hashable objects which compare equal must have the same hash value.

    对于 Python 的标准数据类型来说:

  • 创建之后无法修改(immutable)=可哈希( hashable),例如:字符串(string)、元祖(tuple)
  • 创建之后可修改(mutable)=不可哈希(unharshable),例如:列表(list)、字典(dict)、集合(set),因为它们在改变值的同时却没有改变id,无法由地址定位值的唯一性,因而无法哈希。 

创建方法:

  • 方法一:使用函数set ( [iterable] )。 iterable对象可以为:列表(list)、字符串(string)等任意iterable数据类型,但要求对象是可哈希的(harshable),这里等价于不可更改的(immutable)。
  • 方法二:使用{ }分配。

(1)创建空集合:使用python内置函数set()

s=set()
print(s)     #输出:set()

(2)创建字符串集合:s=set("XXXX") 或者 s={"X","X","X",X"}

s=set("wahoo!")
print(s)      #输出:{'w', 'h', 'o', 'a', '!'} ,每个元素的输出顺序是随机的。

(3)创建元祖集合:s=set((X,X)),也可以用s={(X,X)},但两者不等价

s1=set((1,2,3))
print(s1)      #输出:{1,2,3}

s2={(1,2,3)}
print(s2)      #输出:{(1,2,3)}

(4)创建列表集合:s=set( L ) 或者 s={L[0],L[1],...}

s1=set(["marvel","ohh","test"])
print(s1)     #输出:{"ohh","test","marvel"}

s11={"marvel","ohh","test"}
print(s11)    #输出:{"ohh","test","marvel"}

s2=set([0,12,111])
print(s2)     #输出:{0,12,111}

s22={0,12,111}
print(s22)    #输出:{0,12,111}

(5)创建集合的集合:s=set({X,X,X}) 

s1=set({1,2,3})
print(s1)      #输出:{1,2,3}

a={1,2,3}
s2=set(a)
print(s2)      #输出:{1,2,3}

☆☆☆总结来说,集合的对象必须是iterable类型,集合的元素必须是可哈希的,也就是不可更改的

  • 对象可以是任意iterable类型,如:list、string、dict、set等等;
  • 元素只能是string、数字、tuple等不可更改类型,不能是list、dict、set等可更改类型。

下面是一些错误创建的例子:

#all the sentences here are wrong!!

s1=set([[1,2,3]])
print(s1)     #typeError: unhashable type: 'list'

s2={[1,2,3]}
print(s2)     #typeError: unhashable type: 'list'

a=set([1,2,3])
s3=set(a)
print(s3)     #typeError: unhashable type: 'set'

s4={}
print(type(s4)==set)    #False, s4 is a dict

二、集合操作

2.1 单个集合的操作

  1. len(s):返回集合s中元素个数
  2. s.copy():浅拷贝
  3. s.clear():清除集合s中的所有元素
s={1,2,3,1,3}
len(s)          # 3
b=s.copy()  
print(b)        # {1,2,3}
s.add(4)
print("s=",s)   # {1,2,3,4}
print("b=",b)   # {1,2,3}

2.2 一个集合和一个元素的操作

  1. x in s:判断x是否在集合s中,在返回True,不在返回False
  2. x not in s:判断x是否不在集合s中,不在返回True,在返回False
  3. s.add(x):向集合s中添加元素x,如果x已经在s中,则不添加
  4. s.remove(x):从集合s中删除元素x,如果x不在s中,引发Keyerror,crash!
  5. s.discard(x):从集合s中删除元素x,如果x不在s中,不引发crash。
s=set([1,2,3,4])
x1=1
x2=7
print(x1 in s)       #True
print(x2 in s)       #False
print(x1 not in s)   #False
s.add(x2)
print(s)             #{1,2,3,4,7}
s.remove(1)          #{2,3,4,7}
s.remove(9)          #KeyError: 9
s.discard(9)         #it's OK!
s.discard(2)         #{3,4,7}

2.3 两个集合的操作

  1. s.issubset(t):检查集合s是集合t的子集,即:检查s中的所有元素是否在集合t中,s<=t为True,反之为False
  2. s.issuperset(t):检查集合t是否是集合s的子集,即:检查t中的所有元素是否在集合s中,t<=s为True,反之为False
  3. s.union(t):返回由集合s和集合t中所有元素组成的新集合,即:返回s|t
  4. s.intersection(t):返回由既在集合s中又在集合t中的元素组成的新集合,即:返回s&t
  5. s.difference(t):返回在集合s中但不在集合t中的元素组成的新集合,即:返回s-t
  6. s.update(t):无返回值修改集合s,将在集合t中但不在集合s中的元素添加到集合s中,即:s|=t
s={1,2,3,4}
t={1,4,6,7}
s.issubset(t)       # False
s.issuperset(t)     # False
new1=s.union(t)      # {1,2,3,4,6,7}
new2=s.intersection(t)     # {1,4}
new3=s.difference(t)       # {2,3}
s.update(t)         # s={1,2,3,4,6,7}

注意无返回值的操作!!

猜你喜欢

转载自blog.csdn.net/xiaozhimonica/article/details/89226645