python的集合是一个无序且没有重复元素的序列,集合中的元素必须是可hash对象。集合不记录元素位置和插入顺序,因此,也不支持索引,切片等其他序列类的操作。
定义集合可以使用{} 或者 set(),但定义空集合不能使用{} ,因为{ } 是创建空字典的方法,定义空集合可以使用set()。
下面分别用{} 和 set() 演示如何创建集合
language_set = {'java', 'c', 'python'} # 定义集合
name_set = set() # 定义空集合
fruits_set = set(['apple', 'orange', 'banana', 'apple']) # 定义时有重复元素
print(language_set) # {'c', 'python', 'java'}
print(name_set) # set()
print(fruits_set) # {'banana', 'orange', 'apple'}
在定义fruits_set时,字符串apple存在重复的情况,但python集合会自动去重,因此在输出时,apple并没有重复。去除重复元素是集合的一项重要功能,此外还有成员检测,数学上集合类的计算,例如交集,并集,差集等操作。
add方法向集合中添加新的元素,语法如下:
s.add(element)
add方法将element添加到集合s中,如果集合s已经包含了element,则不进行任何操作,集合中的元素具有唯一性,绝不会出现重复的情况。
language_set = {'java', 'c', 'python'} # 定义集合
language_set.add('c++')
print(language_set) # {'python', 'java', 'c++', 'c'}
update方法同样可以向集合中添加新的元素,且可以一次性添加多个,update方法的本质是先计算两个集合的并集,在用并集更新原集合。
update语法如下:
s.update(seq)
seq参数可以是列表,元素,集合
language_set = {'java', 'c', 'python'} # 定义集合
language_set.update(['node.js', 'php']) # 传入列表
print(language_set) # {'python', 'php', 'java', 'c', 'node.js'}
language_set.update(('javascript', 'c#')) # 传入元组
print(language_set) # {'python', 'php', 'javascript', 'java', 'c', 'c#', 'node.js'}
language_set.update({'vb', 'go'})
print(language_set) # {'python', 'java', 'c', 'javascript', 'c#', 'go', 'vb', 'php', 'node.js'}
python的集合提供了3种删除元素的方法,分别是remove,discard, pop。remove方法语法是
s.remove(element)
remove方法将element从集合中删除,需要注意的是如果element不在集合中,remove方法将会发生错误
>>> language_set = {'java', 'c', 'python'}
>>> language_set.remove('c')
>>> language_set.remove('c++')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'c++'
remove是一种不安全的删除集合元素的方法,想要安全的删除集合元素,可以使用discard方法,当被删除的元素不存在时discard不会发生错误,discard语法如下:
s.discard(element)
示例代码
>>> language_set = {'java', 'c', 'python'}
>>> language_set.discard('c')
>>> language_set.discard('c++')
>>> language_set
{'java', 'python'}
remove和discard方法都没有返回值,它们原地修改集合。
pop方法比较特殊,它的语法定义如下
s.pop()
pop方法没有参数,它随机的删除一个元素并返回该元素,当集合为空时,pop方法会引发KeyError异常。
>>> language_set = {'java', 'c', 'python'}
>>> language_set.pop()
'java'
>>> language_set.pop()
'c'
>>> language_set.pop()
'python'
>>> language_set.pop()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'
获取集合中元素的个数,使用len内置函数
>>> language_set = {'java', 'c', 'python'}
>>> len(language_set)
3
由于集合不支持索引,因此无法像列表那样通过索引操作来获取元素,只能通过for循环遍历集合
language_set = {'java', 'c', 'python'} # 定义集合
for language in language_set:
print(language)
程序输出结果
java
python
c
语法定义
s.clear()
clear方法会将集合中所有元素都删除
>>> language_set = {'java', 'c', 'python'}
>>> language_set.clear()
>>> language_set
set()
判断一个元素是否在集合中需要使用成员运算符 in
>>> language_set = {'java', 'c', 'python'}
>>> 'java' in language_set
True
>>> 'c++' in language_set
False
python集合最常用的3个运算是求集合的交集,并集,差集,它们在编程中的作用非常重要。
交集运算返回一个新的集合,新集合里的元素存在与所有参与计算的集合中,语法定义如下
s.intersection(set1, set2 ... etc)
intersection方法可以传入多个集合,最少传入一个集合,因此set1是必须要传入的,返回的新集合中的元素既在s中,也在set1,set2 ... 中。
>>> language_set_1 = {'java', 'c', 'python'}
>>> language_set_2 = {'java', 'php'}
>>> intersection_set = language_set_1.intersection(language_set_2)
>>> intersection_set
{'java'}
>>> intersection_set = language_set_2.intersection(language_set_1)
>>> intersection_set
{'java'}
字符串java既在language_set_1中,也在language_set_2中,language_set_1调用intersection 和 language_set_2 调用intersection方法,得到的交集是相同的。
并集运算返回一个新的集合,新集合中的元素包含了所有参与运算的集合的元素,你可以理解为将所有集合的元素放在一起组成了一个新的集合。
语法定义
s.union(set1, set2...)
union方法允许传入多个集合,set1必传,因为至少需要传入一个集合参与计算。
>>> language_set_1 = {'java', 'c', 'python'}
>>> language_set_2 = {'java', 'php'}
>>> union_set = language_set_1.union(language_set_2)
>>> union_set
{'java', 'c', 'php', 'python'}
差集运算返回一个新集合,差集运算的结果与运算顺序有关,比如两个集合s1 和 s2,s1对s2求差集的结果与s2对s1求差集的结果是不相同的,除非s1与s2完全相同,他们的差集是一个空集合。
差集语法定义如下
s1.difference(s2)
实例代码
>>> language_set_1 = {'java', 'c', 'python'}
>>> language_set_2 = {'java', 'php'}
>>> diff_set = language_set_1.difference(language_set_2)
>>> diff_set
{'c', 'python'}
>>> diff_set = language_set_2.difference(language_set_1)
>>> diff_set
{'php'}
方法 | 描述 |
---|---|
add() | 为集合添加新元素 |
clear() | 删除集合中的所有元素 |
copy() | 拷贝一个集合 |
difference() | 返回多个集合的差集 |
difference_update() | 从一个集合中删除另一个集合的所有元素,本质上就是删除两个集合的交集部分 |
discard() | 删除集合中指定的元素,元素不存在时不会引发异常 |
intersection() | 返回集合的交集 |
intersection_update() | 计算多个集合的交集然后用交集更新替换原集合 |
isdisjoint() | 判断交集是否为空 |
issubset() | 判断集合是否是另一集合的子集 |
issuperset() | 判断集合是否包含另外一个集合 |
pop() | 随机删除集合中的元素 |
remove() | 移除集合中指定元素,元素不存在时会引发异常 |
symmetric_difference() | 返回两个集合中不重复的元素集合。 |
symmetric_difference_update() | python集合的symmetric_difference_update方法与symmetric_difference类似,都是计算两个集合不重复的部分,区别是symmetric_difference方法返回不重复元素组成的集合,而symmetric_difference_update用这个新集合更新原集合 |
union() | 返回两个集合的并集 |
update() | 计算原集合与另一个集合的并集,并用计算得出的并集更新原集合 |
QQ交流群: 211426309