Python基础-字典Dict
什么是字典
字典是Python中另一种可变容器模型,且可存储任意类型对象。字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 。顾名思义,就像是在查字典一样。有了拼音或偏旁部首(key)去找到想找的字(value)。
字典的特点
- Python 字典是由多个键值对(key-value)组成的集合,每一个 key 和一个 value 相关联(键必须是唯一的,但值则不必)。
- 键值对中的 value 可以是数字、字符串、列表、元组或者其他字典。实际上,可以是任何有效的数据类型。
- 键值对中的 key 必须是不可变对象。也就是说,它不能被改变,具体包括数字、字符串、元组等。(值可以取任何数据类型,但键必须是不可变的,如字符串,数字)
创建字典
需要注意的是如何创建空字段
# 使用{} 创建字段
dict1 = {"username":"i_mycode", "platform":"CSDN"}
print(dict1) #{'username': 'i_mycode', 'platform': 'CSDN'}
# 创建空字典
dict2 = {}
print(dict2) #{}
# 使用内建函数 dict() 创建字典
dict3 = dict(username="i_mycode", platform="CSDN")
print(dict3) #{'username': 'i_mycode', 'platform': 'CSDN'}
# 创建空字典
dict4 = dict()
print(dict4) #{}
其他还有创建字典的方式,可以参看下文创建字典对象的9种方式
字典元素查增改删
字段存储KV信息,重点在于对信息的增删改查,下面一起看下如何对字典内元素的增删改查。
查询字典元素
如果想要访问 key 关联的 value,可以将其放入方括号内:
- 字典对象名[key]
# 有字典dict5
dict5 = {"username":"i_mycode", "age":25, "interest":"Python"}
print(dict5["username"]) #i_mycode
print(dict5["age"]) # 25
print(dict5["interest"]) # Python
当使用上述方式访问到一个key,这个key不存在与字典中,则会报错KeyError。
print(dict5["address"])
#Traceback (most recent call last):
# File "E:/code_py/myPython/test.py", line 3, in <module>
# print(dict5["address"])
#KeyError: 'address'
- get()
此时可以使用字典的get()方法来获取自己不知道字典中是否存在的key的value值。如果不存在则返回None。
get()还可以赋默认值。当key不存在时,返回设置的默认值,见下例:
print(dict5["address"]) #None
print(dict5["address","不存在"]) #不存在
- setdefault()
同get()找不到不会报KeyError,且可赋默认值,不再赘述。
添加字典元素
- 使用[]
dict6 = {"username":"i_mycode", "age":25, "interest":"Python"}
#想添加一个kV address="北京"
dict6["address"] = "北京"
print(dict6) #{"username":"i_mycode", "age":25, "interest":"Python", "address":"北京"}
- update()方法
下面介绍3中update的使用,核心是当update传入的key值如果不在字典中,则添加到字典。如果已存在于字典中,则修改该字典中的该key对应的值
#有字典dict7
dict7 = {"username":"i_mycode", "age":25, "interest":"Python"}
#1.update()参数是字典对象
#当添加的key值原不存在于字典
dict7.update({"address":"北京"})
print(dict7) #{'username': 'i_mycode', 'age': 25, 'interest': 'Python', 'address': '北京'}
#当添加的key值原已存在于字典
dict7.update({"age":24})
print(dict7) #{'username': 'i_mycode', 'age': 24, 'interest': 'Python', 'address': '北京'}
# 2.update()参数是关键字参数
# 当添加的key值原不存在于字典
dict7.update(gender="男")
print(dict7) #{'username': 'i_mycode', 'age': 24, 'interest': 'Python', 'address': '北京', 'gender': '男'}
# 当添加的key值原已存在于字典
dict7.update(address="上海")
print(dict7) #{'username': 'i_mycode', 'age': 25, 'interest': 'Python', 'address': '上海', 'gender': '男'}
#3.update()参数是字典解包
# 当添加的key值原不存在于字典
add_dict = {"a":1, "b":2}
dict7.update(**add_dict)
print(dict7) #{'username': 'i_mycode', 'age': 24, 'interest': 'Python', 'address': '上海', 'gender': '男', 'a': 1, 'b': 2}
# 当添加的key值原已存在于字典
add_dict1 = {"address":"bj", "age":26}
dict7.update(**add_dict1)
print(dict7) #{'username': 'i_mycode', 'age': 26, 'interest': 'Python', 'address': 'bj', 'gender': '男', 'a': 1, 'b': 2}
修改字典元素
- 直接修改已知的key
dict8 = {"username":"i_mycode", "age":25, "interest":"Python"}
#想将age改为26
dict8["age"] = 26
print(dict8) #{"username":"i_mycode", "age":26, "interest":"Python"}
- 上述增加时已经存在于字典中的key则都是修改了,不再赘述
删除字典元素
- del key值
dict9 = {"username":"i_mycode", "age":25, "interest":"Python"}
#删除key:age
del dict9["age"]
print(dict9) #{"username":"i_mycode", "interest":"Python"}
- pop()方法
删除不存在的key时会报错,有参数容错,删不存在的key时,可以指定返回值。
dict9 = {"username":"i_mycode", "age":25, "interest":"Python"}
#删除key:age
a = dict9.pop("age")
print(dict9) #{"username":"i_mycode", "interest":"Python"}
print(a) # 25
dict9.pop("age1")
print(dict9)
# Traceback (most recent call last):
# File "E:/code_py/myPython/test.py", line 6, in <module>
# dict9.pop("age1")
# KeyError: 'age1'
b = dict9.pop("age1","不存在")
print(dict9) #{"username":"i_mycode", "interest":"Python"}
print(b) # 不存在
- clear()
清除字典中所有的kv
dict9 = {"username":"i_mycode", "age":25, "interest":"Python"}
dict9.clear()
print(dict9) # {}
- del 字典对象
直接干掉字典对象
dict9 = {"username":"i_mycode", "age":25, "interest":"Python"}
del dict9
- popitem()
随机删除一个Entry,然后返回删除的Entry(每个Entry是key与value组成的一个Tuple对象)
dict9 = {"username":"i_mycode", "age":25, "interest":"Python"}
res = dict9.popitem()
print(dict9) # {'username': 'i_mycode', 'age': 25}
print(res) # ('interest', 'Python')
字典遍历
- for循环遍历字典
想要遍历字典中的键值对,可以使用一个 for 循环,指定两个代表键和值的变量,用于解包列表中的元组。
Python 字典提供了一个 items() 方法,可以返回一个包含键值对列表的对象,类似于一个元组构成的列表。例如:
person = {
'username': 'i_mycode',
'age': 25,
'interest': ['Python', 'java'],
"address":"bj"
}
print(person.items())# dict_items([('username', 'i_mycode'), ('age', 25), ('interest', ['Python', 'java']), ('address', 'bj')])
# for循环
for key, value in person.items():
print(f"{key}: {value}")
# username: i_mycode
# age: 25
# interest: ['Python', 'java']
# address: bj
- 遍历所有的key
有时候我们只需要遍历字典中的键,这种情况下可以使用 for 循环加上 keys() 方法。keys() 方法用于返回一个包含字典键的对象。或者直接遍历字典对象也是默认返回所有的key对象。
person = {
'username': 'i_mycode',
'age': 25,
'interest': ['Python', 'java'],
"address":"bj"
}
print(person.keys()) #dict_keys(['username', 'age', 'interest', 'address'])
for key in person.keys():
print(key)
# username
# age
# interest
# address
for key in person:
print(key)
# username
# age
# interest
# address
- 遍历所有的value
字典的 values() 方法可以返回一个包含全部值的列表。使用 for 循环加上 values() 方法可以遍历字典中的全部值
person = {
'username': 'i_mycode',
'age': 25,
'interest': ['Python', 'java'],
"address":"bj"
}
print(person.values()) #dict_values(['i_mycode', 25, ['Python', 'java'], 'bj'])
for value in person.values():
print(value)
# i_mycode
# 25
# ['Python', 'java']
# bj
字典推导式
字典推导式可以针对字典执行一个 for 循环,对每个元素执行某些操作(例如变换或者过滤),然后返回一个新的字典。与 for 循环不同,字典推导式提供了一个更具表达能力和简洁性的语法。以下是字典推导式的基本语法:
{key:value for (key,value) in dict.items() if condition}
例如:将字典中每个key的value值做数学运算
my_dict = {
"语文":60,
"数学":80,
"英语":70,
"历史":65,
"政治":68
}
# 可以利用循环遍历的方式处理
new_dict = {}
for k,v in my_dict.items():
new_dict[k] = v + 5
print(new_dict) # {'语文': 65, '数学': 85, '英语': 75, '历史': 70, '政治': 73}
# 利用字典推导式
new_dict1 = {k:v+5 for (k,v) in my_dict.items()}
print(new_dict1) # {'语文': 65, '数学': 85, '英语': 75, '历史': 70, '政治': 73}
#过滤value值小于70的元素
new_dict2 = {k:v for (k,v) in my_dict.items() if v >= 70}
print(new_dict2) # {'数学': 80, '英语': 70}
字典key的特性
字典值可以是任何的 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。
两个重要的点需要记住:
- 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住。
可以看到下面的代码中person字段中有两个address。此时后面的"address":"sh"会被记住
person = {
'username': 'i_mycode',
'age': 25,
'interest': ['Python', 'java'],
"address":"bj",
"address":"sh"
}
print(person["address"]) # sh
- 键必须不可变,所以可以用数字,字符串或元组充当,例如用列表(可变)就不行。
person = {
'username': 'i_mycode',
'age': 25,
'interest': ['Python', 'java'],
"address":"bj",
["csdn"]:"nice"
}
print(person)
# Traceback (most recent call last):
# File "E:/code_py/myPython/test.py", line 6, in <module>
# ["csdn"]:"nice"
# TypeError: unhashable type: 'list'
字典内置函数及方法
字典中有丰富的内置函数及方法供使用,这里学习几个经常使用到的。
字典内置函数
len(dict)
- 计算字典元素个数,即键的"去重"总数。当key有重复时最后一个key的值被记住。len()返回的是去重key数字
- 举例:
dict_len = {"a":1,"b":2,"c":3}
print(len(dict_len)) # 3
dict_len = {"a":1,"b":2,"c":3,"c":4}
print(len(dict_len)) # 3
str(dict)
- 输出字典,可以打印的字符串表示。
- 举例:
dict_str = {"a":1,"b":2,"c":3}
print(str(dict_str)) #{'a': 1, 'b': 2, 'c': 3} 此时是个字符串被输出
dict_str = {}
print(str(dict_str)) #{}
type(variable)
- 返回输入的变量类型,如果变量是字典就返回字典类型
- 举例:
dict_type = {"a":1,"b":2,"c":3}
print(type(dict_type)) #<class 'dict'>
字典方法
dict.clear()
- 删除字典内所有元素
- 举例:
tinydict = {'Name': 'Zara', 'Age': 7}
print("字典长度 : %d" % len(tinydict)) # 字典长度 : 2
tinydict.clear()
print("字典删除后长度 : %d" % len(tinydict)) # 字典删除后长度 : 0
dict.copy()
- 返回一个字典的浅复制
- 举例:
dict1 = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
dict2 = dict1.copy()
print ("新复制的字典为 : ",dict2)
字典的深浅拷贝
这里说一下字典的直接复制,浅拷贝(copy) 和 深拷贝(deepcopy)。
- 直接赋值:其实就是对象的引用(别名)。
- 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
- 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
- 直接赋值
举例:
a = {1: [1,2,3]}
b = a
print(a,b) # ({1: [1, 2, 3]}, {1: [1, 2, 3]})
解析:
- 字典的浅拷贝
举例:
a = {1: [1,2,3]}
b = a.copy()
print(a, b) #({1: [1, 2, 3]}, {1: [1, 2, 3]})
a[1].append(4)
print(a, b) #({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
解析:
- 字典的深拷贝
深拷贝需要引入 copy 模块
举例:
import copy
a = {1: [1,2,3]}
b = copy.deepcopy(a)
print(a, b) # ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
a[1].append(5)
print(a, b) # ({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})
解析:
dict.fromkeys()
- 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
- dict.fromkeys(seq[, value])
- 举例:
seq = ('name', 'age', 'sex')
tinydict = dict.fromkeys(seq)
print("新的字典为 : %s" % str(tinydict)) # 新的字典为 : {'name': None, 'age': None, 'sex': None}
tinydict = dict.fromkeys(seq, 10)
print("新的字典为 : %s" % str(tinydict)) # 新的字典为 : {'name': 10, 'age': 10, 'sex': 10}
dict.get(key, default=None)
- 返回指定键的值,如果键不在字典中返回 default 设置的默认值
- 前面已经介绍了该方法,不再赘述
key in dict
- 如果键在字典dict里返回true,否则返回false
- 举例:
seq = {1:1, 2:2, 3:3}
if 1 in seq:
print("1中存在seq中")