专注统计和Python学习分享
点击上面的statspy关注一下吧
Python内置类型之集合&字典
文章导读集合与字典只是在基础部分提到,它们的基本创建方法,没有细说它们的一些方法,毕竟是可变数据类型,肯定是有增删改查的操作。在这里,你会了解到集合与字典的常用方法,以及应用场景。
一、集合的方法
Python集合基本支持所有数学上的集合的一些性质和运算法则,交并差补。
前面也说到过,集合的创建方式有:构造函数set()创建,字面量{},以及集合推导式,也就基本这三种了。
集合的方法,其实,集合虽然不是序列类型,但是也有一些和共性序列类型数据相同的操作符,比如:in , not in等,还有计算集合元素个数的内置函数len(s)等,以下面的代码看看:
s={1,2,3,'s','a'}bool_in='s' in sprint(bool_in)print('集合的元素个数:', len(s))
集合对象对数据的增删改查操作,这里主要讨论添加和删除操作。
往集合里面添加一个元素的方法为:s.add(x),删除的元素的方法有:s.remove(x), s.discard(x), s.clear(), s.pop()其中的.clear(), .pop()列表也有,其实字典也有,.remove()方法字典没有。看看吧:
s={1,2,3,'s','a'}s.add(4)print('集合的所有元素为:', s)s.remove('a') # 如果元素不存在,报错s.discard('s') # 元素存在才删除print('删除元素后的集合为:', s)s.clear()print('集合元素清空:', s)
集合和列表一样,是一个大杂烩,各种数据类型都是可以存储的。
集合的运算有:交并差补,其实在Python的集合中没有现有的补集运算方法,为什么呢?因为补集是可以转换为差运算的,所以主要是交并差运算。
运算方法和操作符 | 含义说明 |
---|---|
union(x) 或者| | 集合之间取并集,返回新集合 |
intersection(x) 或者 & | 集合之间取交集,返回新集合 |
difference(x) 或者 - | 集合之间取差集,返回新集合 |
issubset(x) 或者 <=或者< | 判断一个集合是否为另一个集合的子集 |
issuperset(x) 或者 >= 或者 > | 判断一个集合是为另一个集合的超集(”父集“) |
update(x) 或者 |= | 更新集合,取并集赋值给原集合 |
intersection_update(x) 或者 &= | 更新集合,取交集赋值给原集合 |
difference_update(x) 或者 - = | 更新集合,取差集赋值给原集合 |
以实际的代码来看看:
s1={1,2,3,5,6}s2={1,3,4,8,5}s3={1,3,4}print('并集为:', s1 | s2)print('交集为:', s1 & s2)print('差集为:', s1 - s2)print('s3是否为s1的子集:', s3 <= s1)print('s3是否为s2的子集:', s3 <= s2)
至于补集的求解,需要按照数学公式来求解,再一个补集,需要涉及到全集的概念,所以全集是不知道的,可能正是这一点,Python没有补集的求解。
二、字典的方法
字典是一个映射类型mapping,和数学中的映射的概念是一样的,是映射中的单射。
一个键key,只能对应一个值value,但是一个值,value可以对应多个键key,这是一个从key集合到value集合的单射。
字典的创建方法,最多的是使用字典构造函数dict()。它的传参参数类型有三种,分别是关键字,mapping映射类型以及可迭代类型作为参数。一起来看看吧:
lst1=[(k,v) for k in list('abcd') for v in range(1,5)] # 可迭代参数给dict时,键之间会发生覆盖lst2=[(k,v) for k,v in zip(list('abcd'), range(1,5))] print(dict(lst2))dic=dict(name='Andy', age=20, Address='qq.com')print(dic)
使用zip函数来构建的一个元组对,再通过解包赋值给一个元组,用列表推导式的方式构建。使用dict函数就可以构造字典。
字典也是一个可变数据类型,增删改的操作是不可少的,字典元素的增加操作,直接以键值对的方式赋值即可,这一点和列表是不同的,列表是不可以用索引下标赋值,只能修改。
字典元素的删除操作是使用关键字del即可,以键值对的形式删除。
所有字典的键值对删除可以使用.clear()方法,popitem()从字典的最后弹出一个键值对。
字典的修改操作,直接使用键值对的方式对已经存在的key赋值即可。查找的方式,都是按照键key来查找,有两种不同的表达:一个是d[key]索引的方式,一个是d.get(key[,default])方法获取值,前者如果没有找到报错,后者可以设置一个默认值,没有找到返回默认值即可。
dic=dict([(k,v) for k,v in zip(list('abcd'),range(1,5))])print(dic['a'])print(dic.get('e',0))print('字典的长度为:', len(dic))print('键值对e-0是否在其中?', 'e' in dic) # 以键的方式判断in即可dic['e']=0 # 增加元素print(dic)dic['e'] = 10 # 修改操作del dic['e'] # 删除k,v=dic.popitem() # 弹出最后一个键值对print('key:{},value:{}'.format(k,v))dic.clear() # 全部清除元素print(dic)
字典重要的增删改查就是上面这些了。
字典还有三个特殊的对象,称之为视图对象(我翻译的)viewobject。
分别是:d.keys()、d.values(),d.items() ,它们都是可迭代对象,也就是说可以用for循环来遍历,这三者的含义分别是:返回键视图对象,值视图对象,键值对视图对象。
之所以叫做视图对象,是因为它们会随着字典的增删改操作而发生变化。一般直接对字典进行遍历,是对键的遍历,类似这种:
dic={'one': 1, 'two': 2, 'three': 3, 'four': 4}print(dic.keys()) # 注意它们不是列表print(dic.values())print(dic.items())for key in dic: print(key, end='\t')print()for value in dic.values(): print(value, end='\t')print()for k,v in dic.items(): print(k,v,sep=': ')
这也是遍历字典的三种方式,非常常用。
内置数据类型之字典集合完结!
END
部分图片|来自网络
—如果喜欢,快分享给你的朋友们吧—
我们一起愉快的玩耍吧
往期回顾
更多精彩
Python内置类型之文本序列
Python内置类型之序列
Python内置类型之数值型
关注我们,扫码了解一下吧