当前位置:博客首页 > Python > 正文

第7课 字典的创建、增删改查及方法、特性

作者: Jarvan 分类: Python 发布时间: 2019-04-12 07:13 百度已收录

字典:字典是一种映射类型(mapping type), 是由键值对组成的,字典的每个元素都有不同的键(key)与之对应,需要通过键来访问元素,字典里的元素排列是无序的,因此字典不是序列类型。因此,字典的键的类型必需是不可变类型(布尔类型、整数类型、浮点数类型、字符串类型、元组类型以及不可变集合类型)。但是字典也是可变类型,因此字典是不能作为字典的键的,不可变类型其实就是说这个类型的值是可哈希的,用python内置的hash函数就可以检验

一、字典的创建

1. 使用{}创建字典

d1 = {}
#创建空字典
d2 = {'a': 1, 'b': 2, 'c': 3}
# python的键必需是不可变类型,值可以是任意的类型
d3 = {1:'hello','name':'jarvan',(1,2):'ceshi',1.2123:'xiaoshu',frozenset("ceshi"):'sdfsdf','True':"ceshi"}
# 不可变类型(布尔类型、整数类型、浮点数类型、字符串类型、元组类型以及不可变集合类型)均为作为字典的键

2. 使用dict函数创建字典

d1 = dict()
# 创建空字典
d3 = dict([('a',1),(2,'b')])
# 创建有元素的字典
# 注意:使用dict创建字典的时候,参数必需是可迭代类型,参数的元素必须是成对出现的,元素的第一个值作为字典的键,第二个值作为字典的值。这种类型的参数可以直接通过zip或者是map函数来快速创建

# 下面的这几种形式都是支持的
# 1. 两个元素组成的二维列表: [['a', 1], ['b', 2], ['c', 3], ['d', 4]]
# 2. 包含双值元组的列表: [('a', 'b'), ('c', 'd'), ('e', 'f')]
# 3. 包含双值列表的元组: (['a', 1], ['b', 2], ['c', 3], ['d', 4])
# 4. 包含双值元组的元组: (('a', 'b'), ('c', 'd'), ('e', 'f'))
# 5. 双字符字符串组成的列表: ['ab', 'cd', 'ef', 'gh']
# 6. 双字符字符串组成的元组: ('ab', 'cd', 'ef')

3. 使用fromkeys方法创建字典

d1 = dict.fromkeys('abcde')
# 1.使用dict.fromkkeys()创建字典,字典的键分别是a,b,c,d,e值都是None
# fromkeys(keys,[value]) 第一个参数是可迭代类型,类型的元素必须是可哈希的, 第二个值是默认值,默认是None

d2 = dict.fromkeys([1,2,3,4], 0)
# 字典的键分别是1, 2, 3, 4值都是0

d3 = {}.fromkeys('abcde')
# 2. 使用{}.fromkeys()创建字典,参数的含义跟使用dict是一样的

d4 = {'a': 2}.fromkeys(["name", "age", "class", "addr"], "")
# 3. 如果{}不是空的,那么使用fromkeys创建时会覆盖掉原来的内容

二、字典的相关操作(增删改查)

1. 访问字典中的值(.get和.setdefault、for循环、.item)

d1 = {"name":"jarvan","birth":1988,"province":"shandong"}
print(d1['birth'])
#【示例1】字典中的值都是通过键名来直接访问的,输出为1988

print(d1.get('birth'))
# 【示例2】使用内键方法get来访问,get方法接收两个参数,第一个是键名,第二个是默认值,输出结果同示例1
# 默认值的意思就是说,假如键名不存在,就返回默认值, 默认值默认是None,如下例:
print(d1.get('wenhao'))
# 输出结果为None

print(d1.get("what", "buzai"))
# 因为键“what”不存在,则回自定义的默认值buzuai

d1 = {"name":"jarvan","birth":1988,"province":"shandong"}
print(d1.setdefault("name"))
# 输出结果为jarvan
d1.setdefault("what", "buzai")
print(d1)
# 输出结果为{'name': 'jarvan', 'birth': 1988, 'province': 'shandong', 'what': 'buzai'}
#使用字典内建方法setdefault来访问字典中的键,该方法接收两个参数,第一个是键名,第二个是默认值None。如果键名存在,就返回键名对应的值,如果键名不存在,则在字典中创建一个键名,并把默认值设为对应的值。

for key in d1:
print(d1[key])
# 通过for循环来访问字典中的元素,for循环默认迭代的是字典中的键(key)

d1 = {"name":"jarvan","birth":1988,"province":"shandong"}
for key,val in d1.items():
    print(key,val)
# 输出结果为
#name jarvan birth 1988 province shandong
#items返回的是类集合对象的dict_items对象,需要使用for循环才能遍历获取里面的元素

2. 修改字典的值

d1 = {"name":"jarvan","birth":1988,"province":"shandong"}
d1["birth"] = 1999
print(d1["birth"])
# 修改字典中的值也是通过键名来修改的

3. 给字典添加新元素(update)

d1 = {"name":"jarvan","birth":1988,"province":"shandong"}
d1["sex"] = "male"
d1.update({"height":178,"weight":160})
print(d1)
# 输出结果为{'name': 'jarvan', 'birth': 1988, 'province': 'shandong', 'sex': 'male', 'height': 178, 'weight': 160}
# 当给字典一个不存在的键名赋值时,字典就会自动的创建对应的键名并把值给它
# 将另一个字典中的元素添加进

4. 删除字典中的元素和字典(del .pop .clear)

d1 = {"name":"jarvan","birth":1988,"province":"shandong"}
del d1["birth"]
# 删除单个元素
d1.pop["province"]
# 把键名为province的元素删除并返回它的值
d1.clear()
# 清空字典中所有元素
del d1
# 删除字典

5. 查询字典中是否存在某个键(in和not in)

d1 = {"name":"jarvan","birth":1988,"province":"shandong"}
print('name' in d1)
print("birth" not in d1)
# 分别显示True和False

三、字典的相关函数(方法)

1. Python的内建函数

Python内建函数

2. 字典的内建方法

字典内建方法

四、字典相关特性总结

  1. 字典是一种映射类型,是由键值对组成的,其中字典的键必需是可哈希的(也就是不可变的),而且同一个字典内不能出现同样的键名字典的值可以是任意类型,同时字典的值是可以重复的
  2. 字典也是一种容器类型,容器类型包括字符串、列表、元组、字典、集合,因为这些类型就像一个容器一样可以装一堆的东西,所以叫容器类型(不要求记住)。所有的容器类型都是可迭代的,也就是可以通过循环语句一个个的把里面的元素拿出来的。所有的容器类型都可以通过len()方法来得到里面元素的个数
  3. 字典是可变类型,因此可以对字典进行增删改查等操作。

作业

问题1:了解字典的各种增删改查

已练习

问题2:知道字典都有哪些特性,并记住这些特性所带来的结果是什么?

已理解

问题3:总结前面学到几种数据类型,归纳出,哪些是可变类型,哪些是不可变类型,哪些是可迭代的,哪些是不可迭代的,并知道他们之间的区别。从而可以在实际使用过程中避免因为操作不当而引发异常。

可变数据类型:列表list和字典dict

不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。

可迭代对象:字符串、列表、元组、字典、集合

2020/4/30 补充

python中defaultdict

defaultdict接受一个工厂函数作为参数,如下来构造:

dict =defaultdict( factory_function)

这个factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0,如下举例:

import re
from collections import defaultdict

text = open('XXXXX.txt',encoding='utf-8').read()
pattern = r'[\s\.,?!:"]+'
words = re.split(pattern,text)

dic = defaultdict(int)
for wd in words:
        dic[wd] += 1
print(dic['Google'])

参考链接:python中defaultdict用法详解

发表评论