#!/usr/bin/env python # coding: utf-8 # # 集合 # 之前看到的列表和字符串都是一种有序序列,而集合是一种无序的序列。 # # 因为集合是无序的,所以当集合中存在两个同样的元素的时候,Python只会保存其中的一个(唯一性);同时为了确保其中不包含同样的元素,集合中放入的元素只能是不可变的对象(确定性)。 # ## 集合生成 # 可以用`set()`函数来显示的生成空集合: # In[1]: a = set() # In[2]: type(a) # 也可以使用一个列表来初始化一个集合: # In[3]: a = set([1, 2, 3, 1]) # In[4]: a # 集合会自动去除重复元素 1。 # # 集合中的元素是用大括号{}包含起来的,这意味着可以用{}的形式来创建集合: # In[5]: a = {1, 2, 3, 1} # In[6]: a # 创建空集合的时候只能用`set()`函数来创建,因为在Python中`{}`创建的是一个空的字典: # In[7]: s = {} # In[8]: type(s) # ## 集合操作 # In[9]: a = {1, 2, 3, 4} # In[10]: b = {3, 4, 5, 6} # 两个集合的并,返回包含两个集合所有元素的集合(去除重复)。可以用方法 `a.union(b)` 或者操作 `a | b` 实现: # In[11]: a.union(b) # In[12]: a | b # 两个集合的交,返回包含两个集合共有元素的集合。可以用方法 `a.intersection(b)` 或者操作 `a & b` 实现: # In[13]: a.intersection(b) # In[14]: a & b # In[15]: b & a # a 和 b 的差集,返回只在 a 不在 b 的元素组成的集合。可以用方法 `a.difference(b)` 或者操作 `a - b` 实现: # In[16]: a - b # In[17]: b - a # In[18]: a.difference(b) # In[19]: b.difference(a) # a 和b 的对称差集,返回在 a 或在 b 中,但是不同时在 a 和 b 中的元素组成的集合。可以用方法 `a.symmetric_difference(b)` 或者操作 `a ^ b` 实现(异或操作符): # In[20]: a.symmetric_difference(b) # In[21]: b.symmetric_difference(a) # In[22]: b ^ a # In[23]: a ^ b # ## 包含关系 # In[24]: a = {1, 2, 3} # In[25]: b = {1, 2} # `.issubset()` 方法或者`b <= a`判断子集: # In[26]: b.issubset(a) # In[27]: b <= a # 与之对应,也可以用`.issuperset()`方法或者`a >= b`来判断: # In[28]: a.issuperset(b) # In[29]: a >= b # 操作符可以用来判断真子集: # In[30]: b > a # In[31]: a > b # ## 集合方法 # `.add()`方法添加单个元素: # In[32]: t = {1, 2, 3} # In[33]: t.add(5) # In[34]: t # 如果添加的是已有元素,集合不改变: # In[35]: t.add(3) # In[36]: t # `.update()`方法更新多个元素: # In[37]: t.update([5, 6, 7]) # In[38]: t # ## 不可变集合 # # 对应于元组与列表的关系,对于集合,Python提供了一种叫做不可变集合的数据结构。 # # 不可变集合使用frozenset()函数来进行创建: # In[39]: s = frozenset([1, 2, 3, 'a', 1]) # In[40]: s # 与集合不同的是,不可变集合一旦创建就不可以改变。 # # 不可变集合的一个主要应用是用来作为字典的键。例如,用一个字典来记录两个城市之间的距离: # In[41]: flight_distance = {} city_pair = frozenset(['Los Angeles', 'New York']) flight_distance[city_pair] = 2498 flight_distance[frozenset(['Austin', 'Los Angeles'])] = 1233 flight_distance[frozenset(['Austin', 'New York'])] = 1515 flight_distance # 由于集合不分顺序,所以不同顺序不会影响查阅结果: # In[42]: flight_distance[frozenset(['New York','Austin'])] # In[43]: flight_distance[frozenset(['Austin','New York'])] # In[ ]: