字典及相关操作
字典是Python中一个无序、可变和有索引的集合
在Python中,字典用花括号{ }编写,拥有键和值
下面将介绍Python中字典的一些常见用法:
1.字典的定义
dic1 = {}
dic2 = dict()
2.字典中键(key)的特点
① 如果同一个键被赋值两次,那么后面的那个值会将会覆盖掉前面的那个值
② 键必须是不可变的,可以用数字、字符串或元组充当,但使用列表绝对不行会报错TypeError: unhashable type: 'list'
3.字典的赋值
情况一:
dic = {key1: value1, key2: value2, key3: value3} #初始时创建非空字典
--------------------------------------------------------------------
情况二:
dic1 = {} #创建一个空字典
n = int(input()) #输入人数
for i in range(n): #循环输入
name, score = input().split() #分割姓名和成绩
dic1[name] = int(score) #在当前字典中建立姓名和成绩的映射
for key, value in dic1.items(): #遍历字典,后面会介绍字典的访问方式
print(key, value) #输出每个键值对
---------------------------------------------------------------------
情况三:
ls1 = ['A', 'B', 'C', 'D']
ls2 = [1, 2, 3, 4]
dic = dict(zip(ls1, ls2)) #将两个列表合并为字典
print(dic) #输出为{'A': 1, 'B': 2, 'C': 3, 'D': 4}
4.删除字典元素
(1)
'''
使用pop(key, default)方法删除指定的元素,此函数的返回值即是被删除的元素值
如删除字典中姓名为joker的元组:
'''
dic1.pop('joker')
(2)
'''
使用popitem()方法随机返回并删除字典中的最后一对键和值。如果字典已经为空却调用了此方法,会报出 KeyError的异常
'''
dic1.popitem()
(3)
'''
使用del函数可用于删除某字典中一特定的键值对,和方法(1)相似
如删除字典中姓名为joker的元组:
'''
del dic1['joker']
(4) 使用clear()方法删除字典中所有的元素
dic1.clear()
'''
clear()方法:清空字典,也就是删除字典内所有键值对,执行结束后
使用 print() 打印时会输出{} ,说明字典还存在,只是被清空了
-------------------------------------------------------------------------
del函数:删除字典(即删除所有键值对以及字典),执行结束后,使用 print() 打印时
会报错 NameError: name 'info' is not defined ,此时表示该字典未被定义,即已不存在该字典
'''
5.字典的遍历
(1) 遍历所有的键
for key in dic:
print(key)
(2) 遍历所有的值
for key in dic:
print(dic[key])
#或者使用下面一种方法
for val in dic.values():
print(val)
(3) 遍历键值对
for key, val in dic.items():
print(key, val)
6.判断元素的存在情况
(1) 判断某个元素是否存在于字典中所有的key里
if 元素 in dic.keys():
print('YES') #存在输出YES
else:
print('NO') #不存在则输出NO
(2) 判断某个元素是否存在于字典中所有的vlaue里
if 元素 in dic.values():
print('YES')
else:
print('No')
(3) 判断某个元组是否存在于字典中所有的元组里
if ('A', 1) in dic.items(): #判断所有元组中是否含有('A',1)这个键值对
print('YES')
else:
print('No')
7.字典的排序方法
Python中的dict是和C++中的map很像的一个容器,虽然底层都是哈希表,但map是无序的,而在3.6版本的Python之后,dict便默认按照插入时的顺序来排列。
当然,有时我们希望按照别的方式让字典重新排列,那么就不得不提到python中强大的sorted函数
sorted(iterable, key=None,reverse=False)
iterator:指可使用for循环迭代的对象
key:指用来进行比较的元素
reverse:为False时升序排列(默认状态),为True降序排列
实际例子:
(1) 对字典的键进行升序排序,注意返回的是列表形式
dic = {'a': 5, 'd': 78, 'e': 100, 'b': 0, 'c': 26}
ls1 = sorted(dic.keys())
print(ls1)
for it in ls1:
print(it, dic[it])
#输出为:
'''
['a', 'b', 'c', 'd', 'e']
a 5
b 0
c 26
d 78
e 100
'''
(2) 对字典的值进行升序排序,注意返回的是列表形式
dic = {'a': 5, 'd': 78, 'e': 100, 'b': 0, 'c': 26}
ls2 = sorted(dic.values())
print(ls2)
for it in ls2:
print(it)
#输出为:
'''
[0, 5, 26, 78, 100]
0
5
26
78
100
'''
# 但实际上,下面(3)和(4)两种方法用的比较多
(3) 按字典的键进行排列,注意返回的是列表形式(此时内部元素是键值对)
dic = {'a': 5, 'd': 78, 'e': 100, 'b': 0, 'c': 26}
ls3 = sorted(dic.items(), key=lambda x: x[0]) #键升序
ls4 = sorted(dic.items(), key=lambda x: -ord(x[0])) #键降序
for key, value in ls3:
print(key, value)
print("------------")
for key, value in ls4:
print(key, value)
#输出为:
'''
a 5
b 0
c 26
d 78
e 100
------------
e 100
d 78
c 26
b 0
a 5
'''
(4) 按字典的值进行排列,注意返回的是列表形式(此时内部元素是键值对)
dic = {'a': 5, 'd': 78, 'e': 100, 'b': 0, 'c': 26}
ls5 = sorted(dic.items(), key=lambda x: x[1]) # 值升序
ls6 = sorted(dic.items(), key=lambda x: -x[1]) # 值降序
for key, value in ls5:
print(key, value)
print("------------")
for key, value in ls6:
print(key, value)
#输出为:
'''
b 0
a 5
c 26
d 78
e 100
------------
e 100
d 78
c 26
a 5
b 0
'''
(5) 按字典的键和值进行排列,注意返回的是列表形式(此时内部元素是键值对)
dic = {'a': 5, 'd': 5, 'e': 100, 'f': 26, 'b': 5, 'c': 26}
ls7 = sorted(dic.items(), key=lambda x: (x[1], x[0])) # 值升序,值相同则按键升序
ls8 = sorted(dic.items(), key=lambda x: (x[1], -ord(x[0]))) # 值升序,值相同则按键降序
for k, v in ls7:
print(k, v)
print("-------")
for k, v in ls8:
print(k, v)
#输出为:
'''
a 5
b 5
d 5
c 26
f 26
e 100
-------
d 5
b 5
a 5
f 26
c 26
e 100
'''
如果要是想对C++中的map排序,那就只能自定义比较器,或者是借助vector和自定义排序函数来做到了,所以Python中的dict还是比较强大的,当然了,要是追求更高的运行的效率,那C++还是更胜一筹。
如果你想了解Python中更详细的自定义排序,可以参考一下这里,谢谢:
Python自定义排序详解