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
posted @ 2022-03-24 16:55  ZghzzZyu  阅读(109)  评论(0)    收藏  举报