Python数据结构——字典

  1. 字典是可迭代的、可变的数据结构,通过键来访问元素。
  2. 字典中的元素是无序的,因为底层使用hash。字典中键要求唯一,值可以重复。字典当中的键要求是不可变序列(如元组、字符串、整数和浮点数等)。
  3. 字典也属于序列,即序列中的方法字典都可以使用。
  4. 字典由两部分组成,键和值,其中,键不可重复,值可以重复。

如下为字典结构的例子:

键(key)值(value)
中国China
美国America

创建字典

方法一:使用大括号 {} 包裹键值对创建字典,键 和 值 之间用冒号分隔,两个键值对之间用逗号分隔。

方法二:用dict()函数,其参数可以是字典、元组、列表。

输入下面代码

a = {}      #创建一个空字典
print(type(a))
b = { 1:'张三',2:'李四',3:'王五'}         #使用大括号创建一个字典
print(b)
c = { 1:'张三',2:'李四',3:'王五',1:'我是张三' }   #由于字典中键不能重复,当有两个相同名字的键时
print(c)                                      #后面的键的值会覆盖前面的
print(c[1])                                   #输出字典中键为 1 的值
print("分割线---------------")
a1 = dict(a)                                    #参数可以是其它字典对象
print(a1)
a1 = dict(((1,'张三'),(2,'李四'),(3,'王五')))     #参数也可以是元组
a2 = dict([(1,'张三'),(2,'李四'),(3,'王五')])     #参数也可以是列表
print(a1)
print(a2)
a3 = dict(zip([1,2],['张三','李四']))            #也可以使用zip()函数,将可迭代对象打包成元组
# 它会将两个括号中的元素对应在一起,前面的是键,后面的是值
print(a3)
t1 = (1,'张三')
t2 = (2,'李四')
t3 = (3,'王五')
t = (t1,t2,t3)
a4 = dict(t)
print(a4)

代码运行结果

<class 'dict'>
{1: '张三', 2: '李四', 3: '王五'}
{1: '我是张三', 2: '李四', 3: '王五'}
我是张三
分割线---------------
{}
{1: '张三', 2: '李四', 3: '王五'}
{1: '张三', 2: '李四', 3: '王五'}
{1: '张三', 2: '李四'}
{1: '张三', 2: '李四', 3: '王五'}

可以看到使用这些方式有的比较复杂,推荐使用大括号的方式创建字典。

删除字典

基本语法格式如下

del 字典名

修改字典

修改字典包括添加、替换和删除键值对,其中访问字典可以通过下标实现,下标参数为对应的键,返回键对应的值。

输入下面代码

a = { 1:'张三',2:'李四',3:'王五'}
a[1] = '我是张三'                  #修改键值对(键存在)
print(a)
a[4] = '赵六'                     #此时没有 4 这个键时,该效果为添加键值对
print(a)
del a[4]                         #删除键值对,若要删除的键值对不存在则会抛出错误
print(a)
b = a.pop(3)                     #删除键值对,若要删除的键值对不存在则会返回默认值(default)
print(a)
print(b)                         #返回删除的值
c = a.popitem()                  #可以删除任意键值对,返回删除的键值对构成元组 
print(a)
print(c)                         #返回删除的值

 代码运行结果

{1: '我是张三', 2: '李四', 3: '王五'}
{1: '我是张三', 2: '李四', 3: '王五', 4: '赵六'}
{1: '我是张三', 2: '李四', 3: '王五'}
{1: '我是张三', 2: '李四'}
王五
{1: '我是张三'}
(2, '李四')

访问字典

方法名描述
d[i]其中d为字典,i为键;如果字典中没有key则会报错。
get(key[,vlues])获取key对应的值;如果字典中没有key则会返回value;如果字典中没有key也没有value则会返回None
items()返回字典所有的键值对
keys()返回字典键视图
values()返回字典值视图

in 和 not in

运算符

只能测试键视图是否包含特定元素
pop(key,default)key存在则获取相应的value,同时删除key-value对,否则获取默认值
popitem()随机从字典中取出一个key-value对,结果为元组类型,同时将key-value从字典中删除
clear()清空字典中所有的key-vaue对

输入下面代码

a = { 1:'张三',2:'李四',3:'王五'}
print(a.get(1))
print(a.get(4,'字典中没有 4 这个键就会出现我'))
print(a.keys())
print(a.values())
print(a.items())
print(3 in a)
print('张三' in a)

代码运行结果

张三
字典中没有 4 这个键就会出现我
dict_keys([1, 2, 3])
dict_values(['张三', '李四', '王五'])
dict_items([(1, '张三'), (2, '李四'), (3, '王五')])
True
False

如果想得到指定格式的字典,可以结合list或tuple函数实现

示例代码如下

dict1 = {'张三':3,'李四':4,'王五':5}
# 获取字典中所有的键
x1 = dict1.keys()
print(x1)
# 获取字典中所有的值
x2 = dict1.values()
print(x2)
# 获取字典中所有的键值对
x3 = dict1.items()
print(x3)
# 也可以先将字典中的数据转成key-value的形式,再以元组的方式进行展示
x4 = list(dict1.items()) # 列表
print(x4)
x5 = tuple(dict1.items()) # 元组
print(x5)

代码运行结果

dict_keys(['张三', '李四', '王五'])
dict_values([3, 4, 5])
dict_items([('张三', 3), ('李四', 4), ('王五', 5)])
[('张三', 3), ('李四', 4), ('王五', 5)]
(('张三', 3), ('李四', 4), ('王五', 5))

Process finished with exit code 0

遍历字典

由于字典既有键视图,也有值视图,因此遍历时可以只遍历键视图,也可以只遍历值视图,也可以同时遍历。遍历可以通过 for 循环来实现

输入下面代码

a = { 1:'张三',2:'李四',3:'王五'}
for key in a.keys():
    print("我的键是:{0}".format(key))
print("分割线--------------")
for value in a.values():
    print("我的值是:{0}".format(value))
print("分割线--------------")
for key,value in a.items():
    print("我的键是:{0},我的值是{1}".format(key,value))

代码运行结果

我的键是:1
我的键是:2
我的键是:3
分割线--------------
我的值是:张三
我的值是:李四
我的值是:王五
分割线--------------
我的键是:1,我的值是张三
我的键是:2,我的值是李四
我的键是:3,我的值是王五

字典合并运算符 |

示例代码如下

A = {'name':'CSDN@邂逅自己'}
B = {'require':'点赞关注+打赏'}
C = A|B
print(A)
print('-'*30)
print(B)
print('-'*30)
print(C)

代码运行结果

{'name': 'CSDN@邂逅自己'}
------------------------------
{'require': '点赞关注+打赏'}
------------------------------
{'name': 'CSDN@邂逅自己', 'require': '点赞关注+打赏'}

Process finished with exit code 0

同步迭代

示例代码如下

score = ['A','B','C','D'] # 若score数据类型为列表,则会输出所有结果;若score数据类型为集合,则可能输出结果为1~2个,因为集合是无序的
counts = [1,2,3,4]
for s,c in zip(score,counts):
    match s,c:
        case 'A',1:
            print('1个同学成绩为A')
        case 'B',2:
            print('2个同学成绩为B')
        case 'C',3:
            print('3个同学成绩为C')
        case 'D',4:
            print('4个同学成绩为D')

代码运行结果

1个同学成绩为A
2个同学成绩为B
3个同学成绩为C
4个同学成绩为D

Process finished with exit code 0

字典生成式

基本格式如下

d = { key:value for items in range }
d = { key:value for items in zip(lst1,lst2) }
# 关键是要分清谁作为key、谁作为value

示例代码如下

import random

dict1 = {item:random.randint(10,20) for item in range(1,6)}
print(dict1)
list1 = [1,2,3,4]
list2 = ['张三','李四','王五','赵六']
dict2 = {index:item for index,item in zip(list1,list2)}
print(dict2)

代码运行结果

{1: 10, 2: 19, 3: 15, 4: 13, 5: 15}
{1: '张三', 2: '李四', 3: '王五', 4: '赵六'}

Process finished with exit code 0

字典推导式

 基本格式如下:

{ key: value for key,value in b.items() if value%2 == 0}

其中b为某个字典对象

注意:这只是示例,在该例子中字典的值视图假定为数字,才能用后面的 if 条件来筛选

输入下面代码

a = {1:10,2:20,3:33,4:44,5:66,6:55}
b = {k:v for k,v in a.items()}
print(b)
#下面为增加if作为筛选条件的结果
c = {k:v for k,v in a.items() if v%2 == 0}
print(c)
#推导式中也可以只有键
d = {k for k in a.keys() if k%2 == 0}
print(d)
#推导式中也可以只有值
e = {v for v in a.values() if v%2 == 0}
print(e)

代码运行结果 

{1: 10, 2: 20, 3: 33, 4: 44, 5: 66, 6: 55}
{1: 10, 2: 20, 4: 44, 5: 66}
{2, 4, 6}
{10, 20, 66, 44}

如果想要系统的学习Python知识,可以点开我的主页,点击专栏“Python零基础从入门到实战”进行学习。

最后,文章创作不易(本文前后经过多次修改,只为了给大家最好的学习教程),如果觉得文章对大家有帮助的话,还请点赞+关注;如果有能力的话,也可以打赏一下喔,谢谢大家!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邂逅自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值