Python:字典(dict)
一:作用
二:定义
三:类型转换
四:内置方法
一:字典类型的作用
按照索引位置存放一组数据用于存取,数据为键值对对应关系
字典无序并且key不可重复
二:字典类型的定义
{}内用多个逗号分隔开key:value,其中value可以为任意类型,但key必须为不可变类型,否则会直接类型错误
mmm = {22:78,'李老八':66,(9,):80}
print(mmm)
lll = {[1,2,3]:2,222:333}
以上代码执行结果为:
Traceback (most recent call last):
File "D:\PyCharm\lizi\basis\20200302\字典.py", line 6, in <module>
lll = {[1,2,3]:2,222:333}
TypeError: unhashable type: 'list'
{22: 78, '李老八': 66, (9,): 80}
有执行结果可以看出,使用字符串整型元组类型定义key都不会报错,使用list定义key直接报错
如何定义一个空字典:
lll = {} print(type(lll))
以上代码执行结果为:
<class 'dict'>
需要注意的是,集合的定义也是用{},如果你使用上边这种方法来定义集合,那它默认只能是个字典
所以可以这样定义空字典或集合:
lll = dict() mm = set() print(type(lll),type(mm))
以上代码执行结果为:
<class 'dict'> <class 'set'>
三:字典类型转换
info =[ ['张三',26], ['李四',22], ['王二麻子',29] ] lll = dict() for i in info: lll[i[0]] = i[1] print(lll)
以上代码执行结果为:
{'张三': 26, '李四': 22, '王二麻子': 29}
由执行结果可以看出,定义一个info列表,定义一个lll空字典,使用for循环遍历info并将值存入了lll,但这样太麻烦了
代码是否可以简单一点呢?
info = [ ['张三',26], ['李四',22], ['王二麻子',29] ] lll = dict() for x,y in info: lll[x] = y print(lll)
以上代码执行结果为:
{'张三': 26, '李四': 22, '王二麻子': 29}
由执行结果可已看出,在for循环传入两个值对应列表的子列表的两个值,并存入空字典lll,但还是很麻烦
再简单一点:
info = [ ['张三',26], ['李四',22], ['王二麻子',29] ] lll = dict(info) print(lll)
以上代码执行结果为:
{'张三': 26, '李四': 22, '王二麻子': 29}
这回终于简单了。
好,那我现在有个需求,我有一个列表,我想把列表里的每个值当成key存入空字典,并给每个key赋予一个相同的默认值,怎么做?
lll = [1,2,3,4,5] mmm = dict() for i in lll: mmm[i] = None print(mmm)
以上代码执行结果为:
{1: None, 2: None, 3: None, 4: None, 5: None}
这样看for循环还真是万能,就是太麻烦了,换个内置方法吧
lll = [1,2,3,4,5] mmm = {}.fromkeys(lll,None) print(mmm)
以上代码执行结果为:
{1: None, 2: None, 3: None, 4: None, 5: None}
使用{}.fromkeys方法可以很方便的解决字典初始值的问题
四:字典类型内置方法
字典的取值:
lll = {'张三':22,'李四':25,'王二麻子':29} print(lll['张三'])
以上代码执行结果为:
22
由执行结果可知,字典取key得出的返回值是value,如果取value会直接报错
字典的赋值:
lll = {'张三':22,'李四':25,'王二麻子':29} lll['张三'] = 33 print(lll)
以上代码执行结果为:
{'张三': 33, '李四': 25, '王二麻子': 29}
由执行结果可知,字典的赋值也是根据key来进行操作,需要注意的是,在list里如果对一个不存在的值进行修改会报错,那么在字典里呢?
lll = {'张三':22,'李四':25,'王二麻子':29} lll['王五'] = 99 print(lll) print('---------此为分割线----------') mmm = ['张三','李四','王二麻子'] mmm[3] = '王五' print(mmm)
以上代码执行结果为:
{'张三': 22, '李四': 25, '王二麻子': 29, '王五': 99} ---------此为分割线---------- Traceback (most recent call last): File "D:\PyCharm\lizi\basis\20200302\字典.py", line 53, in <module> mmm[3] = '王五' IndexError: list assignment index out of range
由执行结果可知,字典里对于一个没有的key的修改操作默认为插入,同时,由于字典是无序的,所以字典也就不存在索引操作
字典的长度:
lll = {'张三':22,'李四':25,'王二麻子':29} mmm = {'张三':22,'李四':25} print(len(lll)) print(len(mmm))
以上代码执行结果为:
3 2
由执行结果可知,len方法统计的是字典的key的个数,当然你也可以说统计的是value的个数
字典的成员运算:
lll = {'张三':22,'李四':25,'王二麻子':29} print('李四' in lll) print('张三' not in lll)
以上代码执行结果为:
True
False
由执行结果可知,in和not in比较的是值与字典里的key是否对应
字典的删除:
lll = {'张三':22,'李四':25,'王二麻子':29} des = lll.pop('张三') aaaa = lll.pop('王二麻子') print(des) print(aaaa)
以上代码执行结果为:
22 29
由执行结果可知,pop方法删除的返回值是字典里的value
字典的删除还有另外一种方法:
lll = {'张三':22,'李四':25,'王二麻子':29,'赵老四':77,'李老八':88} des = lll.popitem() aaaa = lll.popitem() ssss = lll.popitem() print(lll) print(des) print(aaaa) print(ssss)
以上代码执行结果为:
{'张三': 22} ('李老八', 88) ('赵老四', 77) ('王二麻子', 29) ('李四', 25)
.popitem()方法在python3.7以前是随机删除一个key,3.7以后改为删除最后一个加入字典中的key
现在有一个需求,我只想要字典的key或字典的value怎么办?
lll = {'张三':22,'李四':25,'王二麻子':29,'赵老四':77,'李老八':88} print(lll.keys()) print(lll.values()) print(lll.items())
以上代码执行结果为:
dict_keys(['张三', '李四', '王二麻子', '赵老四', '李老八']) dict_values([22, 25, 29, 77, 88]) dict_items([('张三', 22), ('李四', 25), ('王二麻子', 29), ('赵老四', 77), ('李老八', 88)])
完成!
字典的其他方法:
lll = {'张三':22,'李四':25,'王二麻子':29,'赵老四':77,'李老八':88} lll.clear() print(lll)
以上代码执行结果为:
{}
由执行结果可知,字典的clear方法同列表和元组一样都是删除
lll = {'张三':22,'李四':25,'王二麻子':29,'赵老四':77,'李老八':88} print(lll.get('雪人')) print('---------此为分割线---------') print(lll['雪人'])
以上代码执行结果为:
None ---------此为分割线--------- Traceback (most recent call last): File "D:\PyCharm\lizi\basis\20200302\字典.py", line 92, in <module> print(lll['雪人']) KeyError: '雪人'
由执行结果可知,当你按key取value时,如果key不存在,正常来说会报错。
当你使用get方法后,如果这个key不存在那么会返回一个None从而使你的程序不会崩溃
get方法在很多情况下都有用。
lll = {'张三':22} print(lll) lll.update({'张三':99,'王二麻子':29,'赵老四':77,'李老八':88}) print(lll)
以上代码执行结果为:
{'张三': 22} {'张三': 99, '王二麻子': 29, '赵老四': 77, '李老八': 88}
由执行结果可知,update方法时更新字典,更新后字典的值以更新的值为准
我现在有一个需求,我想知道一个字典里有没有某个key,如果有则不需要做什么,如果没有那么将我准备的key和value加进去,怎么做?
这种情况很常见,比如判断是否有某个用户名,有的话不需要创建,没有的话要创建
先用if in来处理:
lll = {'姓名':'李老八','年龄':27} aa = '性别' # print(lll) if aa in lll: print('不需要') ... else: lll[aa] = '男' print(lll)
以上代码执行结果为:
{'姓名': '李老八', '年龄': 27, '性别': '男'}
嗯,要的就是这种效果
python提供了一种方法处理这种问题
lll = {'姓名':'李老八','年龄':27} aa = '性别' lll.setdefault(aa,'男') print(lll)
以上代码执行结果为:
{'姓名': '李老八', '年龄': 27, '性别': '男'}
.setdefault方法默认需要传入key和value,如果你只给了一个key,那么value的值默认为None
.setdefault方法的作用同上方 if in效果一样,在某些场景下比较有用,根据个人来判断用哪种方法吧