python容器类型——字典{dict}
一、特点
- 字典是Python中一个键值映射的数据结构
- 字典是无序的
- 字典是可变对象
- key必须是唯一的, so 天生去重
二、定义
- 元组通过花括号中用键/值对用冒号分割,而各个对用逗号分割
- 定义空字典
singer_null = {}
print(singer_null,type(singer_null))
singer_null = dict()
print(singer_null,type(singer_null))
- 字典的key必须是可hash对象
- python中所有字符串、数字、元组、布尔值、None都是可hash对象
- 字典的value可以是任何值
# key => hashable 可hash对象 => 不可变对象(可变对象=> list)
# value => 任何类型数据
#list不可以作为key
#TypeError: unhashable type: 'list'
singer_song = {1:1,'张韶涵':True,['汪峰']:'普通迪斯高'}
TypeError Traceback (most recent call last)
Input In [6], in <cell line: 3>()
1 #list不可以作为key
2 #TypeError: unhashable type: 'list'
----> 3 singer_song = {1:1,'张韶涵':True,['汪峰']:'普通迪斯高'}
TypeError: unhashable type: 'list'
singer_song = {1:1,'张韶涵':True,('汪峰',):'普通迪斯高','汪峰2':['张韶涵','汪峰','李圣杰']}
print(singer_song)
#{1: 1, '张韶涵': True, ('汪峰',): '普通迪斯高', '汪峰2': ['张韶涵', '汪峰', '李圣杰']}
#boole值可以作为key
#重复定义key时会自动覆盖前一个value值
三、字典的基本操作
1、查看
-
用法1:dicts[key] => 当key不存在时,会引了KeyError错误
songs = { '孤勇者': {'singer':'Eason', 'count':100}, '青花瓷': {'singer':'周杰伦', 'count':101}, '荷塘月色':{'singer':'凤凰传奇', 'count':99} } # 通过key取值 #当key存在时 print(songs["青花瓷"]) #{'singer': '周杰伦', 'count': 101} #当key不存在时 print(songs["青花瓷"]) --------------------------------------------------------------------------- KeyError Traceback (most recent call last) Input In [2], in <cell line: 7>() 1 songs = { 2 '孤勇者': {'singer':'Eason', 'count':100}, 3 '青花瓷': {'singer':'周杰伦', 'count':101}, 4 '荷塘月色':{'singer':'凤凰传奇', 'count':99} 5 } 6 # 通过key取值 ----> 7 print(songs["青花瓷1"]) KeyError: '青花瓷1'
-
用法2:dicts.get(key, default) => 当key不存在时,返回default值
songs = { '孤勇者': {'singer':'Eason', 'count':100}, '青花瓷': {'singer':'周杰伦', 'count':101}, '荷塘月色':{'singer':'凤凰传奇', 'count':99} } print(songs.get("孤勇者")) print(songs.get("孤勇者1",'no')) #{'singer': 'Eason', 'count': 100} #no
2、增加、修改
用法1:dicts[key] = value
- 当key不存在时,表示增加一个键值对
- 当key存在时,表示修改对应的value值
songs = {
'孤勇者': {'singer':'Eason', 'count':100},
'青花瓷': {'singer':'周杰伦', 'count':101},
'荷塘月色':{'singer':'凤凰传奇', 'count':99}
}
# key存在,修改key对应value值
songs["青花瓷"]={}
# key不存在,新增一个key
songs["恰恰恰"]={}
3、删除
- 用法1:dicts.pop(key)
songs = {
'孤勇者': {'singer':'Eason', 'count':100},
'青花瓷': {'singer':'周杰伦', 'count':101},
'荷塘月色':{'singer':'凤凰传奇', 'count':99}
}
songs.pop("荷塘月色1", None)
print(songs)
songs.pop("荷塘月色")
print(songs)
#{'孤勇者': {'singer': 'Eason', 'count': 100}, '青花瓷': {'singer': '周杰伦', 'count': 101}, '荷塘月色': {'singer': '凤凰传奇', 'count': 99}}
#{'孤勇者': {'singer': 'Eason', 'count': 100}, '青花瓷': {'singer': '周杰伦', 'count': 101}}
- 用法2:dicts.popitem():即后进先出
help (songs.popitem())
Help on tuple object:
class tuple(object)
| tuple(iterable=(), /)
|
| Built-in immutable sequence.
|
| If no argument is given, the constructor returns an empty tuple.
| If iterable is specified the tuple is initialized from iterable's items.
|
| If the argument is a tuple, the return value is the same object.
songs = {
'孤勇者': {'singer':'Eason', 'count':100},
'青花瓷': {'singer':'周杰伦', 'count':101},
'荷塘月色':{'singer':'凤凰传奇', 'count':99}
}
print(songs.popitem())
print(songs.popitem())
print(songs.popitem())
#('荷塘月色', {'singer': '凤凰传奇', 'count': 99})
#('青花瓷', {'singer': '周杰伦', 'count': 101})
#('孤勇者', {'singer': 'Eason', 'count': 100})
4、合并字典
- 用法1:dict1.update(dict2) => 将dict2合并到dict1
#对自身的字典进行了修改
singer_song1 = {"李俊杰":"痴心绝对","张韶涵":"阿刁"}
singer_song2 = {"汪峰":"当我想你的时候"}
#对自己singer_song1操作
print(singer_song1.update(singer_song2))
print(singer_song1)
#None
#{'李俊杰': '痴心绝对', '张韶涵': '阿刁', '汪峰': '当我想你的时候'}
- 用法2:dict(dict1, **dict2) => 将dict1与dict2合并生成一个新字典
#没有对自身的字典进行修改,是生成一个新的字典
singer_song1 = {"李俊杰":"痴心绝对","张韶涵":"阿刁"}
singer_song2 = {"汪峰":"当我想你的时候"}
#将字典1和2进行合并到一个新的字典中
new_dict = dict(singer_song1,**singer_song2)
print(new_dict)
#{'李俊杰': '痴心绝对', '张韶涵': '阿刁', '汪峰': '当我想你的时候'}
5、成员关系
- in 和not in,默认是和key值进行对比,放回bool值
singer_song1 = {"李俊杰":"痴心绝对","张韶涵":"阿刁"}
print("李俊杰" in singer_song1)
print("李俊杰1" in singer_song1)
print("当我想你的时候" not in singer_song1.values())
#True
#False
#True
6、遍历
singer_song = {'李俊杰': '痴心绝对', '张韶涵': '阿刁', '汪峰': '当我想你的时候'}
print(singer_song.values())
for value in singer_song.values():
print(value)
print(singer_song.items())
for item in singer_song.items():
print(item)
print(singer_song.keys())
for key in singer_song.keys():
print(key)
dict_values(['痴心绝对', '阿刁', '当我想你的时候'])
痴心绝对
阿刁
当我想你的时候
dict_items([('李俊杰', '痴心绝对'), ('张韶涵', '阿刁'), ('汪峰', '当我想你的时候')])
('李俊杰', '痴心绝对')
('张韶涵', '阿刁')
('汪峰', '当我想你的时候')
dict_keys(['李俊杰', '张韶涵', '汪峰'])
李俊杰
张韶涵
汪峰
四、练习
xiyouji={
'BOSS':'唐僧',
'CTO':'悟空',
'CFO': '八戒',
'搬砖':'沙僧',
'苦力':'白龙马'
}
print(xiyouji['CTO'])
print(xiyouji['BOSS'])
for key in xiyouji:
print(f"{key}是{xiyouji[key]}")
name = input("请输入你要查询的角色:")
if name in xiyouji.values():
print(f"{name}在西游记中")
else:
print(f"{name}不在西游记中")
print("欢迎使用用户检测系统")
# 数据定义放在循环外
users = {
'root': '123456',
'admin': 'admin'
}
while True:
username = input("请输入用户名:")
if username == "exit":
print("你已安全退出")
break
password = input("请输入密码:")
if username in users and password == users[username]:
print("登录成功")
break
else:
print("登录失败")