字典和集合
字典是python中唯一,一个映射类型
如何创建一个字典,如下
>>> dict = {"渗透":"网络安全","笔记":"为了共享","我们":"追逐梦想"}>>> dict["渗透"]'网络安全'
怎么理解字典呢?现实生活中的字典可以通过首字母进行查询要查找的汉子,python也可以这样理解,通过”:”前的元素查找到冒号后的元素。
为什么说字典是唯一一个映射类型呢?看图。
映射类型区别与序列类型,序列类型以数组的形式储存,通过索引的方式来获取相应位置的值,一般索引值与对应位置数据无关系。
简单来说就是你可以通过a找到n,但是a和n无关系。
字典的标志性符号“{}”,用大括号来定义,字典由多个键及其对应的值所构成,每一对键值成为项,很绕口吧。不急。
>>> dict = {"渗透":"网络安全","笔记":"为了共享","我们":"追逐梦想"}>>> dict["渗透"]'网络安全'
例子里的渗透,笔记,我们就是键,而后面的宣传标语就是值了。是不是好理解多了。
注意;字典的键必须是独一无二的,里面的值可以是多个类型,但必须是不可变的(如字符串,数,元组)
如何声明个空字典
>>> a = {}>>> a{}>>> type(a)<class 'dict'>
如例子中直接用一个空的大括号声明即可。
声明字典的多种方式
dict()方法如下
>>> dict1 = dict((('I',23),('V',83),('I',65),('U',3),('Y',343)))>>> dict1{'U': 3, 'I': 65, 'V': 83, 'Y': 343}
这里天钧遇到了故障,进行排查发现我定义过dict
TypeError:'dict' object is not callable 出现这种错误有两种可能: 1. 代码里重新定义了dict,比如 dict= {...},这时调用的是代码里定义的dict而不是python内置类型 2. 取字典内容时用了()而不是[]。比如sdict("content_id"),应该是sdict["content_id"]
我的解决方法是
>>> del dict>>>>>> dict<class 'dict'>>>> del dictTraceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'dict' is not defined>>> dict1 = dict((('I',23),('V',83),('I',65),('U',3),('Y',343)))>>> dict1{'U': 3, 'I': 65, 'V': 83, 'Y': 343}
第二种方法
>>> dict2 = dict(Y = 23,A = 21,W = 56,U=353)>>> dict2{'U': 353, 'W': 56, 'A': 21, 'Y': 23}
对比第一种方法,第二种是比较简洁的。这时注意键的位置上不能加上双引号。否则会报错
>>> dict4 = dict('Y' = 23,'A' = 21,'W' = 56,'U'=353) File "<stdin>", line 1SyntaxError: keyword can't be an expression
直接给字典赋予新的值
>>> dict1['H'] = 12>>> dict1{'U': 3, 'I': 65, 'H': 12, 'V': 83, 'Y': 343}>>>
这时咱们发现字典中的项里的 顺序跟序列是不同的,是因为字典讲究映射不讲顺序,所以很随意。
内置方法
formkeys()
用于创建返回一个新的字典,他有两个参数,第一个参数就是字典的键,第二个参数是可选的,是传入键对应的值。默认为None.
>>> dict1.fromkeys((1,2,3)){1: None, 2: None, 3: None}
>>> dict2 = {('wocao'),"你大爷"}
>>> dict2
{'wocao', '你大爷'}
>>> dict2 = {('wocao',"卧槽","你大爷的"),"你大爷"}
>>> dict2
{('wocao', '卧槽', '你大爷的'), '你大爷'}
>>>
为什么和我们预想的不一样呢?如结果“wocao”你大爷,所示
解释为,他把('wocao',"卧槽","你大爷的")当成一个值了。
key() values() itsms()
key方法用于返回字典中的键如下
>>> dict3 = {}>>> dict3.fromkeys(range(31),'wocao'){0: 'wocao', 1: 'wocao', 2: 'wocao', 3: 'wocao', 4: 'wocao', 5: 'wocao', 6: 'wocao', 7: 'wocao', 8: 'wocao', 9: 'wocao', 10: 'wocao', 11: 'wocao', 12: 'wocao', 13: 'wocao', 14: 'wocao', 15: 'wocao', 16: 'wocao', 17: 'wocao', 18: 'wocao', 19: 'wocao', 20: 'wocao', 21: 'wocao', 22: 'wocao', 23: 'wocao', 24: 'wocao', 25: 'wocao', 26: 'wocao', 27: 'wocao', 28: 'wocao', 29: 'wocao', 30: 'wocao'}>>> dict3.keys()dict_keys([])
咦,为什么没有返回键呢?
看
>>> dict3{}
因为fromkeys根本没有赋予值。如何解决
>>> dict3 = dict3.fromkeys(range(31),'wocao')>>> dict3{0: 'wocao', 1: 'wocao', 2: 'wocao', 3: 'wocao', 4: 'wocao', 5: 'wocao', 6: 'wocao', 7: 'wocao', 8: 'wocao', 9: 'wocao', 10: 'wocao', 11: 'wocao', 12: 'wocao', 13: 'wocao', 14: 'wocao', 15: 'wocao', 16: 'wocao', 17: 'wocao', 18: 'wocao', 19: 'wocao', 20: 'wocao', 21: 'wocao', 22: 'wocao', 23: 'wocao', 24: 'wocao', 25: 'wocao', 26: 'wocao', 27: 'wocao', 28: 'wocao', 29: 'wocao', 30: 'wocao'}>>>
在进行操作
>>> dict3.keys()dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])>>>
完美
values
用于返回字典里的所有值
>>> dict3.values()dict_values(['wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao', 'wocao'])>>>
items
返回字典里的所有项
>>> dict3.items()dict_items([(0, 'wocao'), (1, 'wocao'), (2, 'wocao'), (3, 'wocao'), (4, 'wocao'), (5, 'wocao'), (6, 'wocao'), (7, 'wocao'), (8, 'wocao'), (9, 'wocao'), (10, 'wocao'), (11, 'wocao'), (12, 'wocao'), (13, 'wocao'), (14, 'wocao'), (15, 'wocao'), (16, 'wocao'), (17, 'wocao'), (18, 'wocao'), (19, 'wocao'), (20, 'wocao'), (21, 'wocao'), (22, 'wocao'), (23, 'wocao'), (24, 'wocao'), (25, 'wocao'), (26, 'wocao'), (27, 'wocao'), (28, 'wocao'), (29, 'wocao'), (30, 'wocao')])>>>
字典很大,有的参数我们不知道在不在子弹里,如果不存在就会报错
>>> dict3[32]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 32
get()
当查询一个项
>>> dict3.get(32)>>>
在不在字典里,如果不在get会返回一个None,不会报错
也可以用in 与not in 来判断
清空一个字典
clear()
前面因为帮助理解,天钧用了一个最简单的方法就是把字典del了,其实还有更好的如下
>>> dict2{('wocao', '卧槽', '你大爷的'), '你大爷'}>>> dict2.clear()>>> dict2set()>>>
copy()
复制字典
如下
>>> a = {1,23,4,5,67,87,23}>>> a{1, 67, 4, 5, 87, 23}>>> type(a)<class 'set'>>>> b = a.copy()>>> b{1, 67, 4, 5, 87, 23}>>>
pop与popitem
pop是弹出值,则popitem是弹出对应的项如下
>>> dict4 = {1:"wpcap",2:"342"}>>> dict4.pop(1)'wpcap'>>> dict4.popitem()(2, '342')
update
更新字典
如下
>>> name = {"米老鼠":"老鼠","天钧":"男人","小白":"狗"}
>>> name
{'米老鼠': '老鼠', '小白': '狗', '天钧': '男人'}
>>> name.update(小黑= "猫")
>>> name
{'米老鼠': '老鼠', '小黑': '猫', '小白': '狗', '天钧': '男人'}
>>>
集合
set大家看见如果认真看了有事type返回的是set,这个就是集合,看对比
>>> dict1 = {}>>> dict2 = {1,23,4,5,5}>>> type(dict1)<class 'dict'>>>> type(dict2)<class 'set'>>>>
好奇怪啊,在大括号里如果只是一群数字话没有体现到映射关系的,那么就认为他是个集合。
看个有趣的例子
>>> dict1 = {1,23,4,34,5,5,5,5,5,5,6,32,1,11,32}>>> dict1{32, 1, 34, 4, 5, 6, 11, 23}>>>
你能找到谁失踪了吗?
创建集合
>>> set1 = {1,2,3,4,5,6,7,8}>>> set2 = set([1,2,3,4,5,6,7,8])>>> set1 == set2True>>>
这两种方法是一样的
访问集合
>>> set1{1, 2, 3, 4, 5, 6, 7, 8}>>> for each in set1:... print(each,end = "_")...>>>1_2_3_4_5_6_7_8
将集合变成图片
让集合很稳,嘿嘿嘿 frozenset
>>> set1 = frozenset({1,2,3,4,5,6})>>> set1.add(22)Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'frozenset' object has no attribute 'add'>>>