3.Python数据容器之字典(dict)

字典及相关操作

字典是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自定义排序详解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值