Python系列教程(十五):字典Dict详解

  一、字典介绍  

1、Python字典的基本概念

    字典Dict也是常用的基本数据结构之一,它是一个key-value键值对的数据存储集合,和我们前面学的Set其实是有很大关系的,可以说Set是一个比较特殊的Dict,Set是一个只有key,没有value的Dict,Set里面存放的都是Key。

2、Python字典的基本特性

    ① Dict在Python中用‘{k1:v1,k2:v2,….}’表示,由一个个key:value键值对组成

    ② Dict中的Key必须是可哈希(hash)类型,而且不能重复,如果重复会自动去重

    ③ 它在内存当中的数据结构是非线性的,所以Dict内的元素是有无序的,不能用索引

    ④ 字典Dict是可变的

  二、Dict的操作  

1、Dict的定义

  方法1:使用‘dict’关键字 

    dict(**kwagrs) :使用关键字参数key=value的形式创建一个字典,如果为空,则定义一个空字典

#定义一个空字典
>>>dict1 = dict()
>>>dict1
{}

>>>dict2 = dict(name = 'jimmy')
>>>dict2
{'name': 'jimmy'}

    dict(iterable):使用一个可迭代对象创建一个字典,但是可迭代对象的元素必须是一个二元结构(元组和列表都可以,混合使用也可以,只要是一个二元结构)

#使用一个列表创建字典
>>>dict3 = dict([('a',1),['b',2]])
>>>dict3
{'a': 1, 'b': 2}

#使用一个元组创建字典
>>>dict4 = dict((('c',3),['d',4]))
>>>dict4
{'c': 3, 'd': 4}

    dict(dict):使用一个字典来定义一个字典,复制字典的时候可以使用

#使用一个字典创建字典,相当于字典的复制
>>>dict5 = dict(dict4)
>>>dict5
{'c': 3, 'd': 4}

  方法2:直接使用标志性符号‘{k1:v1}’定义 

#定义一个空字典
>>>dict5 = {}
>>>dict5
{}

>>>dict6 = {'age':28,'name':'jimmy','teacher':[1,3]}
>>>dict6
{'age': 28, 'name': 'jimmy', 'teacher': [1, 3]}

  方法3:使用类方法dict.fromkeys(iterable[,value]) -> NewDict 

    从一个可迭代对象中取出所有元素,作为字典的key,如果没有给定value值,则默认value为None。

>>>dict.fromkeys([1,3,5])
{1: None, 3: None, 5: None}

>>>dict.fromkeys([1,3,5],'hello')
{1: 'hello', 3: 'hello', 5: 'hello'}

2、Dict元素的访问

  方法1:dict[key] -> value 

    返回指定key对应的value值,如果key不存在,则抛出KeyError异常。

>>>dict7 = {'age':28,'name':'jimmy','teacher':[1,3]}

>>>dict7['name']
'jimmy'
>>>dict7['addr']
KeyError: 'addr'

  方法2:dict.get(key[,default_value]) -> value 

    返回指定key对应的value值,如果key不存在,则返回None,如果设置了default_value,在key不存在的情况下返回default_value,反正不管能不能获取到value的值都不会抛出异常

>>>dict8 = {'age':28,'name':'jimmy','teacher':[1,3]}

#正常获取
>>>dict8.get('age')
28

#获取不到,不抛出异常
>>>dict8.get('addr')

#获取不到,返回默认值
>>>dict8.get('addr','China')
'China'

  方法3:dict.setdefault(key[,default_value]) -> value 

    这个是根据key获取value的值,不要名字误导了,先获取,如果获取不到值,会添加kv对,value没有给就为None,有的话就是default_value。

>>>dict9 = {'age':28,'name':'jimmy','teacher':[1,3]}

#正常获取
>>>dict9.setdefault('teacher')
[1, 3]

#获取不到,添加kv对
>>>dict9.setdefault('addr')
>>>dict9
{'age': 28, 'name': 'jimmy', 'teacher': [1, 3], 'addr': None}

#获取不到,添加kv对
>>>dict9.setdefault('job','IT')
>>>dict9
{'age': 28, 'name': 'jimmy', 'teacher': [1, 3], 'addr': None, 'job': 'IT'}

3、字典的增加和修改

   方法1:dict[key] = vaule 

    将key的值设置为value,如果key不存在,则添加kv对

>>>dict10 = {'age':28,'name':'jimmy','teacher':[1,3]}

#key已存在,则修改
>>>dict10['age'] = 29
>>>dict10
{'age': 29, 'name': 'jimmy', 'teacher': [1, 3]}

#key不存在,则添加
>>>dict10['addr'] = 'China'
>>>dict10
{'age': 29, 'name': 'jimmy', 'teacher': [1, 3], 'addr': 'China'}

   方法2:dict.update(**kwargs|iterable|dict) -> None

    使用update方法可以从关键字参数,可迭代对象或者另一个字典更新本字典,参数的用法跟定义一样。所谓更新就是如果已经存在键值对了,就修改,如果没有就添加。

>>>dict11 = {'age':28,'name':'jimmy','teacher':[1,3]}

#使用关键字更新字典
>>>dict11.update(age = 29,addr = 'China')
>>>dict11
{'age': 29, 'name': 'jimmy', 'teacher': [1, 3], 'addr': 'China'}

#使用可迭代对象更新字典
>>>dict11.update([('job','IT')])
>>>dict11
{'age': 28, 'name': 'jimmy', 'teacher': [1, 3], 'addr': 'China', 'job': 'IT'}

#使用字典更新字典
>>>dict11.update({'tel':'123'})
>>>dict11
{'age': 28,
 'name': 'jimmy',
 'teacher': [1, 3],
 'addr': 'China',
 'job': 'IT',
 'tel': '123'}

4、字典的元素删除

   方法1:dict.pop(key[,default_value]) -> value

>>>dict12 = {'age':28,'name':'jimmy','teacher':[1,3]}

>>>dict12.pop('age','default_value')
28

#设置了默认值:key不存在,弹出默认值
>>>dict12.pop('addr','default_value')
'default_value'

#没有设置默认值:key不存在,报错
>>>dict12.pop('age')
KeyError: 'age'

   方法2:dict.popitem() -> item 

    随机弹出一个K:V对,如果字典为空,抛出异常

>>>dict13 = {'age':28,'name':'jimmy','teacher':[1,3]}

#随机弹出一个k:v对
>>>dict13.popitem()
('teacher', [1, 3])

>>>dict13.popitem()
KeyError: 'popitem(): dictionary is empty'

   方法3:dict.clear() -> None 

   清空字典

>>>dict14 = {'age':28,'name':'jimy','teacher':[1,3]}

>>>dict14.clear()
>>>dict14
{}

   方法4:del关键字 

    del obj:删除一个对象的引用(变量),本质上删除的是名称,而不是对象

>>>dict15 = {'age':28,'name':'jimmy','teacher':[1,3]}

>>>del dict15['teacher']
>>>dict15
{'age': 28, 'name': 'jimmy'}

#定义一个变量
>>>addr = 'China'
>>>dict16 = {'age':28,'name':'jimmy','teacher':[1,3],'addr':addr}
>>>dict16
{'age': 28, 'name': 'jimmy', 'teacher': [1, 3], 'addr': 'China'}

#删除addr这个变量
>>>del addr
>>>addr
NameError: name 'addr' is not defined

#'China'这个对象还在,还有其他引用
>>>dict16
{'age': 28, 'name': 'jimmy', 'teacher': [1, 3], 'addr': 'China'}

5、字典的遍历

  方法1:遍历key 

>>>dict17 = {'age':28,'name':'jimmy','teacher':[1,3]}

>>>for key in dict17.keys():
>>>    print(key)
age
name
teacher

#遍历一个字典,默认是遍历一个字典的所有keys
>>>for key in dict17:
>>>    print(key)
age
name
teacher

  方法2:遍历values 

>>>dict18 = {'age':28,'name':'jimmy','teacher':[1,3]}

#直接使用values()遍历所有值
>>>for value in dict18.values():
>>>    print(value)
28
jimmy
[1, 3]

#间接遍历所有keys,然后通过所有keys,找到所有values
>>>for k in dict18:
>>>    print(dict18[k])
28
jimmy
[1, 3]

  方法3:遍历items 

>>>dict19 = {'age':28,'name':'jimmy','teacher':[1,3]}

#直接输出item
>>>for item in dict19.items():
>>>    print(item)
('age', 28)
('name', 'jimmy')
('teacher', [1, 3])

#使用k,v接收键值对
>>>for k,v in dict19.items():
>>>    print(k,'---',v)
age --- 28
name --- jimmy
teacher --- [1, 3]

#使用一个丢弃变量‘_’来接收k的值,后面不需要用到
>>>for _,v in dict19.items():
>>>    print(v)
28
jimmy
[1, 3]

  遍历一个可迭代对象时,要注意的一个坑  

    Python中,遍历可以说是用的非常多的一种快速迭代的手段,但是稍微不注意,很容易犯的一个问题就是,在遍历一个可迭代对象的时候,又在不断的增加或者移除这个可迭代对象的元素,这样会直接引起错误或造成一些不可预见的问题。所以正确的做法应该是使用一个临时变量来进行对接,反正你记住要迭代对象你不能够进行增加或者移除操作。

>>>dict20 = {'age':28,'name':'jimmy','teacher':[1,3]}

>>>for k,v in dict20.items():
>>>    print(k,v)
>>>    dict20['new'+k] = v

#说的很清楚,字典在迭代的过程当中发生了改变
RuntimeError: dictionary changed size during iteration

#再用一个列表来测试
>>>list1 = [1, 3, 'abc']

>>>for i in list1:
>>>    print(i)
>>>    list1.append('new'+str(i))
#输出了几千个值,为什么?因为在迭代的时候,你不断的再给list加元素,所以列表迭代无穷尽,最终进入递归。

  三、扩展字典  

1、defaultdict:默认值字典

    defaultdict是模块collections提供的默认字典,使用它创建的字典具有当你要操作的key不存在的时候,会自动帮你添加k:v对

    使用方法:collections.defaultdic([factory_function]) -> NewDict

    其中参数factory_function:需要传一个函数作为参数,这个函数的作用就是当年key不存在的时候,会调用这个函数来生成对应的value。

#导入模块
>>>import collections

#定义一个默认值字典
>>>dict21 = collections.defaultdict(list)

#现在字典是空的,直接使用,如果没有会创建一个key:value = 'a':[]
>>>dict21['a']
[]

2、OrderedDict:有序字典

    普通字典的元素是无序的,但是某些应用场景需要一个有序字典,元素按顺序加入字典,最后也可以按顺序取出,在collections模块提供了这样一个字典,可以让字典有序。

#导入模块
>>>import collections

#定义一个有序字典
dict22 = collections.OrderedDict()

#顺序插入元素
for k,v in list(zip(range(5),'abcde')):
    dict22[k] = v
    
dict22
OrderedDict([(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e')])

#弹出是按最尾的元素有序弹出
dict22.popitem()
(4, 'e')
dict22.popitem()
(3, 'd')
.....

Jimmy's Blog ,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.xjimmy.com/python-15-dict.html

Leave a Comment