查看原文
其他

数据类型——Dict、Set与Frozenset简析

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:李钊颖

文字编辑:余术玲

技术总编:张   邯

重磅!!!爬虫俱乐部将于2019年10月2日至10月5日在湖北武汉举行Python编程技术培训,本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python编程技术,尤其是爬虫技术和文本分析技术。该培训目前在火热招生中,点击《爬虫俱乐部2019十一Python编程技术培训报名啦!》或点击文末阅读原文,了解培训详细信息,抓紧时间报名吧!
在进行Python编程之前,我们需要先了解基本的数据类型有哪些,例如数值型、字符串、列表、元组、字典、集合等等。在往期推文中,我们已经介绍了前面几种类型,今天我们详细介绍字典和集合,包括基本用法及结合运算符的一些运算。
字典(dict)
1.字典的定义方法
字典是一系列键值对的可修改的组合,通过一个大括号来定义,每个键都与一个值相对应,构成Key-Value键值对,可以通过访问键来得到相应的值,其中键是唯一的,值可以不唯一。如果将键比喻为“目录”,值比喻为“内容”,字典变量就像我们使用目录去查找内容。
In [1]:dicta={} #定义一个空字典In [2]: dictb={'sam':1,'william':2,'ben':1}In [3]: dictbOut[3]: {'sam': 1, 'william': 2, 'ben': 1}

2.字典的特
(1) 字典的键在存储的时候需要计算哈希值,从而实现快速访问,所以必须是不可变的类型,如数字、字符串、元组等,值却没有规定,可以为任何对象,甚至列表、另一个字典都是可以的。
In [4]: dictc={'naen':4, (1,):2} #字典的键可以是元组,这里的“(1,)”为只有一个元素的元组In [5]: dictcOut[5]: {'naen': 4, '5': 6, '7': {8}, (1,): 2}
In [6]: dictc={'naen':4,'5':6,'7':{8}} #字典的值可以是字典In [7]: dictcOut[7]: {'naen': 4, '5': 6, '7': {8}}
键输入可变对象,则会报错:
In [8]: dictc={'naen':4,'5':6,'7':{8},[1]:2}---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-7-a8fd8b025869> in <module>----> 1 dictc={'naen':4,'5':6,'7':{8},[1]:2}
TypeError: unhashable type: 'list'
这里第四个键值对的键是可变对象列表,由于字典的键必须是不可变的,这里程序报错了。

(2) 字典没有索引值,通过在方括号内输入相应的键来查找对应的值。
In [9]: dictc[2]---------------------------------------------------------------------------KeyError Traceback (most recent call last)<ipython-input-6-bb4c2b9ea2a9> in <module>----> 1 dictc[2]
KeyError: 2 #字典不能通过索引来查找对应的值
In [10]: dictc['naen'] #若想查找对应的值,只能通过访问键来查找对应的值Out[10]: 4


字典在Python3.6之前是无序的,顺序访问字典时可能与输入的顺序不一致,这是字典对键进行哈希运算再确定存储位置导致的,所以使用3.5版本的读者可能会遇到for循环遍历时的顺序与录入顺序不一致的情况。在Python3.6以后,对字典进行了优化,这也间接导致访问字典的顺序与输入顺序一致了,所以字典成为了有序组合。


(3) 字典可以被修改
当字典中有这个键值对时,修改对应的值:
In [11]: dictc['5']=10In [12]: dictcOut[12]: {'naen': 4, '5': 10, '7': {8}}  #可以看到键'5'对应的值由6被修改为10

当字典中没有这个键值对时,则创建新的键值对:

In [13]: dictc['emma']='girl' In [14]: dictcOut[14]: {'naen': 4, '5': '10', '7': {8}, 'emma': 'girl'}  #创建为新的键值


(4) 字典可以被for循环遍历
字典在遍历时,默认情况下遍历的是键:
In [15]: for i in dic1: : print(i)
输出结果为:
nameagehobby


可变集合(set)
Python中的集合数据类型指的是一系列值(元素)组成的一个集合。set()函数创建一个无序不重复元素集,可进行关系测试、删除重复数据,以及计算数学运算,如交集、并集、差异和对称差异。

1.集合的定义方法
set可以说是listdict的杂合。例如set数据类型可以用“{}”大括号来定义;其元素是无序的,也就是非序列类型的数据;而且,set中的元素不可重复,这类似于dict中的键。set也有一些list的特点,比如可以原处修改。
可变集合set可以使用大括号“{}”或者set()函数创建集合,但是创建空集合时必须用set()而不是大括号“{}”,因为“{}”是用来创建空字典
In [16]: member = {'Sam', 'William', 'Bentley'} #定义一个非空集合In [17]: memberOut[17]: {'Bentley', 'Sam', 'William'}


2.集合的特点
定义一个集合之后,可以判断某个元素是否在集合内,如我们现在希望判断Julia是不是在member集合里:
In [18]: a = 'Julia' In [19]: if a in member: : print(f'{a}在集合中') : else: : print(f'{a}不在集合中')
输出结果为:
Julia 不在集合中

(1) 无序性
In [20]: Aya = set([12,'baidu','weibo','tencent','facebook'])In [21]: AyaOut[21]: {12, 'baidu', 'facebook', 'tencent', 'weibo'} #元素的顺序改变了

创建可变集合set,元素顺序排列不一定是按照我们输入的顺序排列。


(2) 自动过滤重复元素
In [22]: fruit = set(['apple','banana','orange','apple','orange'])In [23]: fruitOut[23]: {'apple', 'banana', 'orange'} #重复元素不见了

集合自动将重复的元素过滤删除掉了。


(3) 可以进行集合运算
a. 交集运算,得出两个集合的相同元素。
In [24]: color = set(['red','yellow','orange'])In [25]: fruit & colorOut[25]: {'orange'}   #留下的是两个集合的共同元素


b. 并集运算,将两个集合的元素剔除重复之后拼接起来。
In [26]: fruit | colorOut[26]: {'apple', 'banana', 'orange', 'red', 'yellow'}  #两个集合的非重复元素拼接


c. 差集运算,将被减集合中两者共有的元素去掉
In [27]: fruit - colorOut[27]: {'apple', 'banana'}In [28]: color - fruitOut[28]: {'red', 'yellow'}
结果是去掉元素的被减集合,即包含fruit中但不包含color中的元素组成的集合,反之亦然。


d. 过滤掉共有元素,输出两个集合中的不同元素。
In [29]: fruit ^ colorOut[29]: {'apple', 'banana', 'red', 'yellow'} #删除重复元素,只留下不同元素

不可变集合(frozenset)
与元组类似,Python也可以生成一个不可变的集合,冻结后的集合不能再添加或删除任何元素。使用frozenset()创建一个不可变集合:
In [30]: A = frozenset('book')In [31]: AOut[31]: frozenset({'b', 'k', 'o'}) # frozenset()也可自动过滤重复元素
不可变集合不可修改,试图修改会报错:
In [32]: A.add('m')---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-3-5047f2bff51e> in <module>----> 1 A.add('m')
AttributeError: 'frozenset' object has no attribute 'add'
不可变集合是不变的,因此它支持的方法和操作符都不能影响不可变集合本身,不过对于set集合中不改变本身的方法和操作符都是支持的。下面举例说明:
例如不可变集合支持遍历访问集合中的值:
In [33]: for i in A:      :     print(i)
输出结果为:
kbo

例如集合间的运算:

In [34]: B = set('pen') #创建一个可变集合

此时A为不可变集合,B为可变集合,对两个集合做并集运算:

In [35]: B = set('pen') #创建一个可变集合 此时A为不可变集合,B为可变集合,对两个集合做并集运算:In [36]: A | BOut[36]: frozenset({'b', 'e', 'k', 'n', 'o', 'p'})  #输出不可变集合In [37]: B | AOut[37]: {'b', 'e', 'k', 'n', 'o', 'p'}  #输出可变集合
若左右两个集合的类型相同,即同为可变集合或同为不可变集合,则产生的结果类型相同。若操作符两边集合类型不同,则产生的结果类型与操作符左边的类型相同


小结
dict数据类型是一种无序的、可变的组合数据类型,其中包含n(n>=0)个键值对,字典的键必须是唯一且不可变的,如数字、字符串、元组,值则不限制,可以为任何对象。dict是可修改的,也可以通过输入相应的键来查找对应的值、对dict进行数据项的添加和移除操作;dict没有索引,也不能使用切片、操作符进行操作。dict的一个优点是查找速度快,无论dict包含多少元素,查找速度都一样,而list正好与dict相反,占用内存小但是查找速度慢,因为每次查找都需要进行遍历。list的查找速度随着元素的增加而逐渐下降。
set是无序不重复的可变集合,基本功能包括关系测试和消除重复元素。frozenset是冻结的集合,是不可变的,其他特点与集合一致。
最后附上本文总结表,对本文进行梳理和总结:


对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

         数据类型介绍——tuple、list和range对象
         把pdf文件批量转成docx文件
         格式化字符串方法的比较
 字符串的小帮手之ascii()、str()和repr()函数

 朝花夕拾—— 如何输出内存中的矩阵与绘图

 朝花夕拾——putdocx批量输出变量观测值

        爬虫俱乐部2019十一Python编程技术培训报名啦!
        Stata16新功能——定义图形元素的绝对大小
        添加docx内容哪家强,Stata16新命令帮你忙
        将数值型计算“一网打尽”——(1)
        将数值型计算“一网打尽”——(2)
        Stata16新功能之“框架”——读入多个数据集(1)
 Stata16新功能——同一个文档,不一样的布局
 手持Python,斗图不输!

 万般进制千机变,Python一计乾坤定——利用Python来进行进制转换

        朝花夕拾——cnstock与cntrade强强联合


关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。



此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存