从零开始的python学习——字典
ʕ • ᴥ • ʔ
づ♡ど
🎉 欢迎点赞支持🎉
个人主页:励志不掉头发的内向程序员;
专栏主页:python学习专栏;
文章目录
前言
一、字典是什么
二、创建字典
三、查找 key
四、新增/修改元素
五、删除元素
六、遍历字典元素
七、取出所有 key 和 value
八、合法的 key 类型
总结
前言
字典也是 Python 中一个比较常用的一个内置类型,我们本章节就来简单讲讲它的使用方法已经它的增删查改。我们一起来往下看。
一、字典是什么
字典是一种存储键值对的结构。
键值对是计算机/生活中一个非常广泛使用的概念,把键(key)和值(value)进行一个一对一的映射,然后就可以根据键,快速找到值。
就好像我们上学时期,学校会给我们不同的学生分配唯一的学号,此时知道了学号,就能确定这个学生了。而这里的 “学号” 就是 “键”,“学生” 就是 “值”。
在 Python 的字典中,可以同时包含很多个键值对,同时要求这些键,不能重复。
二、创建字典
创建一个空的字典,使用 { } 表示字典,也可以使用 Python 中的关键字 dict 来创建。
# 创建字典
a = {}
print(type(a))
b = dict()
print(type(b))
也可以在创建的同时指定初始值。
键值对之间使用 , 分割、键和值之间使用 : 分割(冒号后面推荐加一个空格)。
使用 print 来打印字典内容。
# 创建字典的同时设置初始值
a = {'id' : 1, 'name' : 'zhangsan'}
print(a)
在此字典中,写了两个键值对:
第一个键值对是 'id' : 1,key 就是 'id',value 就是 1。
第二个键值对是 'name' : 'zhangsan',key 就是 'name',value 就是 'zhangsan'。
一个字典中的 key 的类型不一定都一样,一个字典中 value 的类型也不必都一样。但是字典对应 key 的类型是有约束的(不是什么类型都可以是 key),对 value 类型却没有啥约束。
我们上面的字典只有两个键值对还好,但是如果键值对多了,那我们这种写法就会有很长的一行,不够直观,所以这里建议一个键值对就写一行,以下的写法就比较直观了。
a = {'id' : 1,'name' : 'zhangsan'
}
print(a)
三、查找 key
使用 in 可以判定 key 是否在字典中存在,返回布尔值。
# 使用 in 来判定某个 key 是否在字典中存在
a = {'id' : 1,'name' : 'zhangsan'
}print('id' in a)
print('classId' in a)
查看 'id' 和 'classId' 是否在字典 a 中,在就返回 True,不在就返回 False。
我们的 in 操作只是判断 key 是否在字典中,和 value 无关。
#in 只是判定 key 是否存在,和 value 无关
print('zhangsan' in a)
由于 'zhangsan' 是 value 而非 key,所以在判定中仍然是 False 而非 True。
当然,我们除了 in,还有一个 not in 是来判定 key 在字典中不存在,与 in 相反。
# 使用 not in 来判定某个 key 是否在字典中不存在
a = {'id' : 1,'name' : 'zhangsan'
}print('id' not in a)
print('classId' not in a)
使用 [ ] 通过类似于取下标的方式,获取到元素的值,只不过此处的 "下标" 是 key(可能是整数,也可能是字符串等其他类型)。
# 使用 [ ] 来根据 key 获取到 value
a = {'id' : 1,'name' : 'zhangsan'
}print(a['id'])
print(a['name'])
当然,我们 [ ] 中填入的是 key,具体是上面类型就看 key 是什么类型的,不是一定就只能填字符串。
# 使用 [ ] 来根据 key 获取到 value
a = {100 : 'lisi'
}print(a[100])
如果 key 在字典中不存在,则会抛出异常。
a = {100 : 'lisi'
}print(a['classId'])
这个错误信息就表示我们的 key 不存在。
对于字典来说,使用 in 或者 [ ] 来获取 value,都是非常高效的操作。
对于列表/元组来说,使用 in 是比较低效的,而使用 [ ] 是比较高效的操作。
主要是因为字典背后使用了特殊的数据结构:哈希表。这个数据结构特别擅长查找。而我们列表背后是类似于顺序表,这个数据结构擅长插入数据而非查找数据。
四、新增/修改元素
使用 [ ] 可以根据 key 来新增/修改 value。
如果 key 不存在,对取下标操作赋值,即为新增键值对。
# 在字典中新增元素,使用 [ ] 来进行
a = {'id' : 1,'name' : 'zhangsan'
}# 这个操作就是往字典里插入新的键值对
a['score'] = 90
print(a)
我们如果把这个 key 值输出出来肯定就会报错,因为它不存在,但是这里是插入操作,所以就没有问题了。
如果 key 已经存在,对取下标操作赋值,即为修改键值对的值。
# 在字典中,根据 key 修改 value,也是使用 [ ] 来进行
a['score'] = 100
print(a)
我们可以发现,'score' 值对应的 90 修改成了 100。
这里就和前面的变量创建是类似的:
a = 10 # a 当前不存在,这里就是定义变量(创建新变量)
a = 20 # a 当前已经存在了,这里就是修改变量
五、删除元素
使用 pop 方法根据 key 删除对应的键值对。
# 使用 pop 方法,根据 key 来删除键值对
a = {'id' : 1,'name' : 'zhangsan'
}a.pop('name')
print(a)
此时打印就不再包含 'name' 的键值对了。
其实,字典的各种操作,都是针对 key 来进行的。新增、删除、获取 value、修改 value......,都是如此。
六、遍历字典元素
直接使用 for 循环能够获取到字典中所有的 key,进一步的就可以取出每个值了。
# 直接使用 for 循环来遍历字典
a = {'id' : 1,'name' : 'zhangsan','score' : 90
}for key in a:print(key, a[key])
for 循环只能拿到 key 值,不能拿到 value,我们想要输出 value 还得使用 [ ]。
我们可以发现,我们遍历打印的顺序和我们定义的顺序是一样的。大家如果学过 C++/Java 就应该知道,我们哈希表里面的键值对存储顺序是无序的。所有我们插入元素的顺序,不代表我们打印的顺序。但是在 Python 中做了特殊处理,能够保证遍历出来的顺序,就是和插入的顺序是一样的。
七、取出所有 key 和 value
使用 keys 方法可以获取到字典中的所有的 key。
a = {'id' : 1,'name' : 'zhangsan','score' : 90
}print(a.keys())
返回的结果看上去像列表,但是又不完全是。它是一个自定义类型,但是使用的时候也可以把它当作一个列表来使用。
使用 values 方法可以获取到字典中的所有 value
a = {'id' : 1,'name' : 'zhangsan','score' : 90
}print(a.values())
和 keys是类似的,返回的结果看上去也像列表把 value 包含进去的。
使用 items 方法可以获取到字典中所有的键值对。
a = {'id' : 1,'name' : 'zhangsan','score' : 90
}print(a.items())
这就就像一个列表一样的结构,里面存储了很多个元组,元组里面包含了键和值。
此时我们就可以通过多元赋值的操作改进 for 循环。
a = {'id' : 1,'name' : 'zhangsan','score' : 90
}for key, value in a.items():print(key, value)
八、合法的 key 类型
不是所有的类型都可以作为字典的 key。
字典本质上是一个哈希表,哈希表的 key 要求是 "可哈希的",也就是可以计算出的哈希值。
可以使用 hash 函数计算某个对象的哈希值,hash 函数是 Python 的内置函数,可以直接使用。
#使用 hash 函数能够计算出一个变量的哈希值
print(hash(0))
print(hash(3.14))
print(hash('hello'))
print(hash(True))
print(hash((1, 2, 3)))
但凡能够计算出哈希值的类型,都可以作为字典的 key。
以上的类型都可以计算哈希值,但是有的类型就无法计算,我们hash去计算它们的时候会直接报错。
列表无法计算哈希值
# 有的类型是不能计算哈希值的
print(hash([1, 2, 3]))
此时错误信息就是列表不可哈希。
字典也无法计算哈希值
# 有的类型是不能计算哈希值的
print(hash({ }))
所以说像上面的整型、浮点型、字符串等可哈希的类型就可以作为字典的 key 使用,像下面的列表、字典等不可哈希的就不能作为字典的 key 使用。
不可变的对象,一般就是可哈希的。而可变的对象,一般就是不可哈希的。我们的整型等,可以明确的用一种规范的方式算出我们的哈希值,但是我们列表等,随时都可以插入和删除,没办法用一种规范的方式算出我们的哈希值。
总结
字典类型也是属于 Python 中比较常用的类型,关于它的操作,我们已经介绍了不少了,但是其实这些只是这些操作中最基础的增删查改,如果想要学习更加复杂的操作,我们可以去查看 Python 的官方文档,或者等博主后面再慢慢更新。
🎇坚持到这里已经很厉害啦,辛苦啦🎇
ʕ • ᴥ • ʔ
づ♡ど