Python:【字典】
字典常用操作
1.构造(初始化)
(1)基本构造
①空字典
>>>dic1={}
>>>dic2=dict()
②直接赋值
>>>dic3={'name':'zhangdanshen','age':22}
>>>dic1.update(name='zhangdanshen')
#使用dict和关键字参数创建
>>>dic4=dict(name='zhangdanshen',age=22)
>>>dic4
{'name':'zhangdanshen','age':22}
③通过二元组列表创建
>>>lis=[(name,'zhangdanshen'),(age,22)]
>>>dic=dict(lis)
>>>dic
{'name':'zhangdanshen','age':22}
④通过zip创建
>>>dic=dict(zip('abc',[1,2,3]))
>>>dic
{'a':1,'b':2,'c':3}
⑤通过生成式
通常用于键值均为数字的情况
>>>dic={i:2**i for i in range(1,4)}
>>>dic
{1:2,2:4,3:8}
⑥通过dict.fromkeys()创建
通常用来初始化字典, 设置value的默认值
>>>dic=dict.fromkeys(range(3),'a')
>>>dic
{0:'a',1:'a',2:'a'}
【注意】
字典的键不可以为列表和字典,但可以为元组
(2)值为列表的构造
① 方法:
dic={} dic.setdefault(key,[]).append(value)
② 参数:
key即字典的键; 因为值为列表,使用"[]"表示; value即为列表中的一个值
>>>dic={}
>>>dic.setdefaule('stu',[]).append('zhangdanshen')
>>>dic.setdefaule('stu',[]).append('chengnuo')
>>>dic
{'stu':['zhangdanshen','chengnuo']}
(3)值为字典的构造
① 方法:
dic={} dic.setdefault(key1,{})[key2]=value
② 参数:
key1为字典dic的键;因为值为字典,使用"{}"表示; key2为字典值的键; value即为字典值中的一个值
>>>dic={}
>>>dic.setdefault('stu',{})['zhangdanshen']=22
>>>dic.setdefault('stu',{})['chengnuo']=20
>>>dic
{'stu':{'zhangdanshen':22,'chengnuo':20}}
(4)defaultdict的使用
如下文3.(1)中所述,当直接由键获取值时,如果键不存在则会出现KeyError的错误。
defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值
① 方法
dic=defaultdict(factory_function)
② 参数
factory_function可以是list、set、str等等,作用是当key不存在时,返回的是factory_function的默认值。
比如list对应[],str对应的是空字符串"",set对应set( ),int对应0。
>>>from collections import defaultdict
>>>dic1 = defaultdict(int)
>>>dic2 = defaultdict(set)
>>>dic3 = defaultdict(str)
>>>dic4 = defaultdict(list)
>>>dic1[2],dic2[2],dic3[2],dic4[2]=2,(2,2),"two",[2,2]
>>>print(dic1[1])
>>>print(dic2[1])
>>>print(dic3[1])
>>>print(dic4[1])
0
set()
[]
【注意】
在用于统计时,尽量使用 Counter() 而不使用 defaultdict(int),后者在进行加减时会产生不必要的错误。
2.字典遍历
(1)遍历字典键
直接遍历字典与遍历keys()相同
>>>dic={'a': '1', 'b': '2', 'c': '3'}
>>>for key in dic:
print(key+':'+dic[key])
a:1
b:2
c:3
>>>for key in dic.keys():
print(key+':'+dic[key])
a:1
b:2
c:3
(2)遍历字典值
通过遍历values()
>>>dic={'a': '1', 'b': '2', 'c': '3'}
>>>for value in dic.values():
print(value)
1
2
3
(3)遍历字典键值
通过遍历items()
>>>dic={'a': '1', 'b': '2', 'c': '3'}
>>>for key,value in dic.items():
print(key+':'+value)
a:1
b:2
c:3
3.字典常用方法
(1) get()方法
dict.get(key) 方法根据 key 来获取 value。与dic[key]获取的方法不同的是,使用 get() 方法访问不存在的 key,返回 None,不会导致错误。
而直接获取的方法会引发 KeyError 错误。
但是通常使用的是dict.get(key,default=None),返回指定键的值,如果键不在字典中返回 default 设置的默认值
>>>dic={'a': '1', 'b': '2', 'c': '3'}
>>>dic.get('a')
1
>>>dic.get('x')
None
>>>dic['x']
KeyError
>>>dic.get('x',0)
0
(2) 其他方法
| 函数 | 作用 |
|---|---|
| dict.clear() | 删除字典内所有元素 |
| dict.fromkeys(seq,val) | 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值。此处为dict 类直接调用,而非字典对象调用。 也可用于给字典所有键赋相同值 |
| dict.items() | 返回一个视图对象。用于获取字典中的所有 key-value 对 |
| dict.keys() | 返回一个视图对象。 用于获取字典中的所有key值 |
| dict.values() | 返回一个视图对象。 用于获取字典中的所有value值 |
| dict.setdefault(key, default=None) | 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default,在返回该值 |
| dict.update(dict2) | 把字典dict2的键/值对更新到dict里。已经存在的键修改值,不存在的键直接添加键值对 |
| dict.pop(key[,default]) | 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。 键值对会被删除 |
| dict.popitem() | 以元组返回并删除字典中的最后一对键和值。 |
>>>dic={'a': '1', 'b': '2', 'c': '3'}
#1.fromkeys()
>>>dic1=dict.fromkeys(['a','b','c'],1)
>>>dic1
{'a': 1, 'b': 1, 'c': 1}
#将所有字典元素设置为0
>>>dic2=dict.fromkeys(dic,0)
>>>dic2
{'a': 0, 'b': 0, 'c': 0}
#2.setdefault()
>>>dic.setdefault('a')
1
>>>dic.setdefault('x',99)
99
#dic被修改
>>>dic
{'a': '1', 'b': '2', 'c': '3', 'x': 99}
#3.update()
>>>dic.update({'c':7,'d':8})
>>>dic
{'a': '1', 'b': '2', 'c': 7, 'd': 8}
4.字典排序
(1) 方法
sorted(dic,value,reverse)
(2) 参数说明
dic:比较函数 value:排序的对象(字典的键或值) reverse:升序或降序,True为降序,False为升序(默认)
(3) 返回值
该方法返回类型根据dic而定。
(4) 实例
①按键(key)排序
>>>dic={1: 2, 2: 2, -8: 1, 8: 1, -4: 2, 4: 1, -2: 1}
>>>res=sorted(dic.items(),key=lambda x:x[0])
>>>res
[(-8, 1), (-4, 2), (-2, 1), (1, 2), (2, 2), (4, 1), (8, 1)]
②按值(value)排序
>>>dic={1: 2, 2: 2, -8: 1, 8: 1, -4: 2, 4: 1, -2: 1}
>>>res=sorted(dic.items(),key=lambda x:x[1])
>>>res
[(-8, 1), (8, 1), (4, 1), (-2, 1), (1, 2), (2, 2), (-4, 2)]
③先按值排,再按键排
>>>dic={1: 2, 2: 2, -8: 1, 8: 1, -4: 2, 4: 1, -2: 1}
#先按值的降序排,再按键的升序排
>>>res=sorted(dic.items(),key=lambda x:(-x[1],x[0]))
>>>res
[(-4, 2), (1, 2), (2, 2), (-8, 1), (-2, 1), (4, 1), (8, 1)]
④字典列表排序
>>>lis=[{'name':'zhangdanshen','age':24},{'name':'chengnuo','age':24},{'name':'zhangxinnuo','age':6}]
#先按 age 排序,再按 name 排序
>>>sorted(lis, key = lambda i: (i['age'], i['name']))
[{'name': 'zhangxinnuo', 'age': 6}, {'name': 'chengnuo', 'age': 24}, {'name': 'zhangdanshen', 'age': 24}]
#按 age 降序排序
>>>sorted(lis,key=lambda i:i['age'],reverse=True)
[{'name': 'zhangdanshen', 'age': 24}, {'name': 'chengnuo', 'age': 24}, {'name': 'zhangxinnuo', 'age': 6}]
(5) 补充
①sort()与sorted()
dic.sort()会改变dic的结构;sorted(dic,...)不会改变dic的结构
详见https://www.cnblogs.com/ZghzzZyu/p/15725034.html
②lambda
匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。
lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。其实lambda返回值是一个函数的地址,也就是函数对象。
如上面实例中,sorted(dic.items(),key=lambda x:x[0]),排序对象为x所表示的对象的第一项,而x表示dic.items()的元素,即为一个键值对的二元组。
- x:x[0]则表示排序对象为字典的键,x:x[1]则表示排序对象为字典的值;
- x:(x[0],x[1])则表示排序先按字典的键,再按字典的值;
- x:-x[1]则表示排序按字典值的降序。
5.其他应用
(1) 根据字典值找到键
通过字典的keys()与values()的值是一一对应的特点
但是,当所找的值存在多个的情况下,只会返回第一个值对应的键
>>>dic={1: 3, 2: 3, 3: 1}
>>>list(c.keys())[list(c.values()).index(1)]
3
>>>dic={1: 3, 2: 3, 3: 1, 5:1}
>>>list(c.keys())[list(c.values()).index(1)]
3
(2) 获取最大值对应的键
key_name = max(my_dict, key=my_dict.get)
当所找的值存在多个的情况下,只会返回第一个最大值对应的键
>>>dic={1: 3, 2: 3, 3: 1}
>>>key=max(dic,key=dic.get)
>>>key
1

浙公网安备 33010602011771号