和列表类似,Python 集合也是一个数据集合,其也不要求元素的类型一致,但是集合有下面两个特点:
我们可以从列表创建集合,将列表中的元素都加入到集合中,如果有重复的元素就仅保留一个。
>>> a = set([1, 1, 3]) >>> a set([1, 3]) # 重复的元素被丢弃 >>> type(a) # 查看类型 <type 'set'>
下面的例子说明了集合的无序性:
>>> a = set([100, 99, 1, 1, 3]) # 从列表中构建一个集合 >>> type(a) # 得到a的类型 <type 'set'> # 类型是字典型 >>> a # 查看a的内容 set([3, 1, 99, 100]) # 可以发现其顺序和添加的顺序是无关的
也可以从元组、字典和其他集合构建集合。
下面的例子是用元组构建集合:
>>> a = set((0, 1, 2, 3, 3, 2)) # 从元组构建集合 >>> a # 重复元素被丢弃 {0, 1, 2, 3} >>> type(a) # 查看类型 <class 'set'>
下面的例子是从字典构建集合,使用的是字典的键来构建集合,字典的值没有被使用到:
>>> a = set({1:10, 2:20, 3:30}) >>> a {1, 2, 3} >>> type(a) <class 'set'>
下面的例子是从字符串构建集合,其每个字符都成为集合的一个元素:
>>> a = set("abcdefabc") # 以字符串为输入创建一个集合 >>> a # 查看a的内容 {'c', 'e', 'f', 'b', 'd', 'a'} >>> type(a) # 查看a的类型 <class 'set'>
下面的例子是从另外一个集合构建集合:
>>> a = set([1, 2, 3]) # 3个元素的集合 >>> b = set(a) # 用集合a作为输入,创建一个新的集合b >>> b # 查看b的值 {1, 2, 3} >>> type(b) # 查看b的类型 <class 'set'>
当然也可以构造一个空的集合,使用的方法是 set()。空集合没有任何元素。
>>> a = set() # 创建一个空的集合 >>> type(a) # 查看类型 <class 'set'> >>> len(a) # 得到元素个数 0
该函数只能添加一个元素。
>>> a = set() # 构造一个空的集合 >>> a.add(1) # 添加一个元素1 >>> a # 查看a的值 set([1]) # 的确包含唯一一个元素1 >>> a.add(100) # 再次添加元素100 >>> a # 查看现在a的值 set([1, 100]) # 包含两个元素了
如果添加的元素已经在集合中存在,那么不会发生任何变化。
>>> a # a是包含1和100的集合 set([1, 100]) # a的内容 >>> a.add(100) # 添加重复的元素100 >>> a # a没有发生任何变化 set([1, 100])
该函数删除集合中指定的值对应的元素。
>>> a = set([1, 2, 3]) >>> a set([1, 2, 3]) >>> a.discard(1) >>> a set([2, 3])
如果指定值在集合中不存在,则不做任何操作。
>>> a set([2, 3]) >>> a.discard(100) >>> a set([2, 3])
该函数和 discard() 的不同之处在于,如果指定的值在集合中不存在,会抛出异常。
>>> a = set([1, 2, 3]) >>> a.remove(1) >>> a set([2, 3]) >>> a.remove(10) # 删除不存在的元素10,抛出KeyError异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 10
该函数扔掉所有的元素。执行完该函数后,该集合将变成一个空的集合。
>>> a = set([1, 2, 3]) >>> a set([1, 2, 3]) >>> a.clear() >>> a set([]) >>> a.clear() >>> a set([])
如果集合中有元素,则返回值为删除掉的元素的值。
>>> a = set([1, 2, 3]) >>> a.pop() 1 >>> a set([2, 3])
如果集合为空,则抛出异常。
>>> a = set([]) >>> len(a) 0 >>> a set([]) >>> a.pop() Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'pop from an empty set'
该函数判断是否存在这样的元素,其同时属于集合 a 和集合 b。如果存在这样的元素,返回 False;否则返回 True。
>>> a = set([1, 2, 3, 4]) >>> b = set([1, 2, 10, 20]) >>> a.isdisjoint(b) False >>> c = set([100, 200]) >>> a.isdisjoint(c) True
a 是 b 的子集就是说集合 a 的所有元素都属于集合 b。
>>> a = set([1, 2]) >>> b = set([1, 2, 10, 20]) >>> a.issubset(b) # 集合a是集合b的子集吗 True # 是的 >>> c = set([1, 10, 20, 30, 40]) >>> a.issubset(c) False
如果 a 等于 b,那么 a 和 b 互为子集。
>>> a = set([1, 2]) # 集合a和集合b值相同,但是是不同的对象 >>> id(a) # 集合a的id 49020712 >>> b = set([2, 1]) >>> id(b) # 集合b的id,不同于a的id 49018024 >>> a is b # 集合a和b不是一个对象 False >>> a == b # 集合a和b的内容相等 True >>> a.issubset(b) # a是b的子集 True >>> b.issubset(a) # b也是a的子集 True
a 是 b 的超集合就是说集合 b 中的所有元素都属于集合 a。
>>> a = set([1, 2]) >>> b = set([1, 2, 10, 20]) >>> b.issuperset(a) True >>> b.issuperset(b) True >>> a.issuperset(b) False
如果 a 是 b 的超集,那么 b 就是 a 的子集。
>>> a = set([1, 2, 3, 4]) # a包含所有b的元素 >>> b = set([1, 3]) >>> a.issuperset(b) # a是b的超集 True >>> b.issubset(a) # b是a的子集 True
如果 a 等于 b,那么它们互为子集,同时也互为超集。
>>> a = set([1, 2]) # 集合a和b值相同,但是不是一个对象 >>> b = set([2, 1]) >>> a == b # 值相同 True >>> a is b # 不是一个对象 False >>> a.issuperset(b) # 它们互为超集 True >>> b.issuperset(a) True