11Python基础-字典Dict

什么是字典

字典是Python中另一种可变容器模型,且可存储任意类型对象。字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 。顾名思义,就像是在查字典一样。有了拼音或偏旁部首(key)去找到想找的字(value)。
在这里插入图片描述

字典的特点

  1. Python 字典是由多个键值对(key-value)组成的集合,每一个 key 和一个 value 相关联(键必须是唯一的,但值则不必)。
  2. 键值对中的 value 可以是数字、字符串、列表、元组或者其他字典。实际上,可以是任何有效的数据类型。
  3. 键值对中的 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,可以将其放入方括号内:

  1. 字典对象名[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'
  1. get()
    此时可以使用字典的get()方法来获取自己不知道字典中是否存在的key的value值。如果不存在则返回None。
    get()还可以赋默认值。当key不存在时,返回设置的默认值,见下例:
print(dict5["address"]) #None
print(dict5["address","不存在"]) #不存在
  1. setdefault()
    同get()找不到不会报KeyError,且可赋默认值,不再赘述。

添加字典元素

  1. 使用[]
dict6 = {"username":"i_mycode", "age":25, "interest":"Python"}
#想添加一个kV address="北京"
dict6["address"] = "北京"
print(dict6) #{"username":"i_mycode", "age":25, "interest":"Python", "address":"北京"}
  1. 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}

修改字典元素

  1. 直接修改已知的key
dict8 = {"username":"i_mycode", "age":25, "interest":"Python"}
#想将age改为26
dict8["age"] = 26
print(dict8) #{"username":"i_mycode", "age":26, "interest":"Python"}
  1. 上述增加时已经存在于字典中的key则都是修改了,不再赘述

删除字典元素

  1. del key值
dict9 = {"username":"i_mycode", "age":25, "interest":"Python"}
#删除key:age
del dict9["age"] 
print(dict9) #{"username":"i_mycode", "interest":"Python"}
  1. 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) # 不存在
  1. clear()
    清除字典中所有的kv
dict9 = {"username":"i_mycode", "age":25, "interest":"Python"}
dict9.clear()
print(dict9) # {}
  1. del 字典对象
    直接干掉字典对象
dict9 = {"username":"i_mycode", "age":25, "interest":"Python"}
del dict9
  1. 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')

字典遍历

  1. 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
  1. 遍历所有的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
  1. 遍历所有的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 对象,既可以是标准的对象,也可以是用户定义的,但键不行。
两个重要的点需要记住:

  1. 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住。
    可以看到下面的代码中person字段中有两个address。此时后面的"address":"sh"会被记住
person = {
    'username': 'i_mycode',
    'age': 25,
    'interest': ['Python', 'java'],
    "address":"bj",
    "address":"sh"
}
print(person["address"]) # sh
  1. 键必须不可变,所以可以用数字,字符串或元组充当,例如用列表(可变)就不行。
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 方法,完全拷贝了父对象及其子对象。
  1. 直接赋值

举例:

a = {1: [1,2,3]}
b = a
print(a,b) # ({1: [1, 2, 3]}, {1: [1, 2, 3]})

解析:
在这里插入图片描述

  1. 字典的浅拷贝

举例:

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]})

解析:

  1. 字典的深拷贝
    深拷贝需要引入 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中")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@nanami

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

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

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

打赏作者

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

抵扣说明:

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

余额充值