Python3 集合
集合(set)是一个无序不重复元素的序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
创建格式:
a = {1, 2, 3, "hi"} print(a) # 结果是:{1, 2, 3, 'hi'} print(type(a)) # 结果是:<class 'set'> b = set("Python") print(b) # 结果是:<class 'set'> print(type(b)) # 结果是:<class 'set'>
a = set("Python") b = set("cpython") # 集合a中包含元素 print(a - b) # 结果是:{'P'} # 集合a或b中包含的所有元素 print(a | b) # 结果是:{'c', 'y', 'p', 'P', 'o', 'h', 'n', 't'} # 集合a和b中都包含了的元素 print(a & b) # 结果是:{'h', 't', 'y', 'o', 'n'} # 不同时包含于a和b的元素 print(a ^ b) # 结果是:{'P', 'p', 'c'}
集合的基本操作
添加元素
# 添加元素 a = set(("Python", "China", "hi")) a.add("new") print(a) # 结果是:{'Python', 'China', 'new', 'hi'} # 添加元素方法2,且参数可以是列表,元组,字典等 b = set("cnblogs") b.update({1, 2, 3}) print(b) # 结果是:{1, 2, 3, 'b', 'n', 'o', 'g', 'l', 'c', 's'} b.update({"key", "value"}) print(b) # 结果是:{1, 'c', 'b', 2, 3, 'o', 'key', 's', 'n', 'value', 'g', 'l'}
移除元素
#移除元素 a = set(("Python","China","Google")) a.remove("China") print(a) #结果是:{'Google', 'Python'} #a.remove("Baidu")# 不存在会报错 KeyError: 'Baidu' # 移除元素方法2 如果元素不存在,不会发生错误 b = set("Python") b.discard("N") print(b) # 移除元素方法3 随机删除集合中的一个元素 b.pop() print(b)# 结果是:{'t', 'h', 'n', 'o', 'y'}
计算集合元素个数
a = set("Python") print(len(a)) # 结果是:6
清空集合
a = set("Python") a.clear() print(a) # 结果是:set()
判断元素是否在集合中存在
a = set("Python") print("y" in a) # 结果是:True
collections
collections模块在内置数据类型(dict、list、set、tuple)的基础上,还提供了几个额外的数据类型:ChainMap、Counter、deque、defaltdict、namedtuple和OrderedDict等。
- namedtuple:生成可以使用名字来访问元素内容的tuple子类
- deque:双端队列,可以快速的从另外一侧追加和推出对象
- Counter:计数器,主要用来计数
- OrderedDict:有序字典
- defaultdict:带有默认值的字典
namedtuple
命名元组有助于对元组每个位置赋予意义,并且让我们的代码有更好的可读性和自文档性。你可以在任何使用元组地方使用命名元组。在例子中我们会创建一个命名元组以展示为元组每个位置保存信息。
from collections import namedtuple Point = namedtuple('Point', ["x", "y"]) # 定义命名元组 p = Point(10, 20) print(p) # 结果是:Point(x=10, y=20)
deque
使用list
存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list
是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
from collections import deque q = deque(["a", "b", "c"]) q.append("x") q.appendleft("y") print(q) # 结果是:deque(['y', 'a', 'b', 'c', 'x'])
Counter
Counter 作为字典(dict)的一个子类用来进行hashtable计数,将元素进行数量统计、计数后返回一个字典,键值为元素:值为元素个数
from collections import Counter s = 'abcbcaccbbad' l = ['a', 'b', 'c', 'c', 'a', 'b', 'b'] d = {'2': 3, '3': 2, '17': 2} # Counter 获取各元素的个数,返回字典 print(Counter(s)) # 结果是:Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1}) print(Counter(l)) # 结果是:Counter({'b': 3, 'a': 2, 'c': 2}) print(Counter(d)) # 结果是:Counter({'2': 3, '3': 2, '17': 2})
OrderedDict
使用dict
时,Key是无序的。在对dict
做迭代时,我们无法确定Key的顺序。如果要保持Key的顺序,可以用OrderedDict
:
from collections import OrderedDict d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) # 结果是:{'a': 1, 'b': 2, 'c': 3} od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od) # 结果是:OrderedDict([('a', 1), ('b', 2), ('c', 3)]) # 注意:OrderedDict的Key会按照插入的顺序排列,不是Key本身排序
defaultdict
默认字典,是字典的一个子类,继承有字典的方法和属性,默认字典在进行定义初始化的时候可以指定字典值得默认类型:
import collections dic = collections.defaultdict(dict) dic['k1'].update({'k2': 'aaa'}) print(dic) # 结果是:defaultdict(<class 'dict'>, {'k1': {'k2': 'aaa'}})
各种推导式
推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导:
- 列表推导式
- 集合推导式
- 字典推导式
列表推导式
# 列表推导式 # list1 = [out_exp_res for out_exp in input_list if out_exp == 2] # out_exp_res: 列表生成元素表达式,可以是有返回值的函数。 # for out_exp in input_list: 迭代input_list将out_exp传入out_exp_res表达式中。 # if out_exp == 2: 根据条件过滤哪些值可以。 mul = [i for i in range(20) if i % 2 == 0] print(mul) # 结果是:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
集合推导式
它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}
set1 = {i for i in range(20) if i % 2 == 0} print(set1)#结果是:{0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
字典推导式
Dict = ["Python","China","me"] dictresult = {key:value for key,value in enumerate(Dict)} print(dictresult)