字典
1.列表可以存储大量的数据类型, 如果数据量大的话, 查询速度就会比较慢
列表只能按照顺序存储, 数据与数据之间关联性不强
2.数据类型按照可变与不可变分类:
-
不可变(可哈希)的数据类型: int str bool tuple
-
可变(不可哈希)的数据类型:list dict set
-
字典是python语言中的映射类型, 用{}表示, 里面的内容是以键值对存储的
-
key:必须是不可变(可哈希的)的数据类型,并且key是唯一不可变的, 不重复
-
值可以是任意数据类型,对象。
-
字典3.5x版本之前(包括3.5)是无序的。
-
字典3.6x会按照初次建立字典的顺序排列,学术上不认为是有序的。
-
字典3.7x以后都是有序的。
-
字典的优点:查询速度非常快,存储关联性的数据。
-
字典的缺点:以空间换时间。
-
-
字典创建方式
# 字典的创建方式
# 方式一
# dic = dict((('one', 1), ('two', 2), ('three', 3)))
# print(dic) # {'one': 1, 'two': 2, 'three': 3}
# 方式二
# dic = dict(one=1, two=2, three=3)
# print(dic)
# 方式三
# dic = dict({'one': 1, 'two': 2, 'three': 3})
# print(dic)
# 创建字典的方式四: 快速初始化一个字典
keys = ['name', 'age', 'gender']
# values = ['悟空', '999', 'male']
# 用for循环实现
# dict1 = {}
# for k in keys:
# dict1[k] = None
# print(dict1)
# dict1 = {}.fromkeys(keys, None)
# print(dict1)
-
验证字典的合法性
# 验证字典的合法性
# dic = {[1, 2, 3]: 'alex', 1: 666} # 字典的键是不可变的数据类型
# print(dic)
# dic = {1: 'alex', 2: '太白', 1: 'wusir'} # 键要唯一 这种情况是不会报错的, 后面的数据会把前面的数据覆盖掉
# print(dic) # {1: 'wusir', 2: '太白'}
-
字典的增删改查
# 字典的增删改查
# dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '钢管', '开车']}
# 增
# 直接增加, 有则改之, 无则增加
# dic['gender'] = 'male' # 默认加到字典的最后面
# print(dic)
# dic['age'] = 25 # 修改值
# print(dic)
# setdefault 有则不变, 无则增加
# dic.setdefault('hobby')
# dic.setdefault('hobby', '学习')
# dic.setdefault('age', 22) # 如果字典里面已经有了这个key, 是不会改变原来数据的 22是不会改到字典里面的
# print(dic)
# 删
# pop 按照key删除键值对, 有返回值
# 设置第二个参数无论字典中有无此键都不会报错
# print(dic.pop('age')) # 这里返回的是value
# print(dic.pop('hobby', '没有这个key')) # 第二个参数要设置, 不然会报错
#popitem 3.5版本之前,popitem为随机删除,3.6之后为删除最后一个,有返回值
dic = {'name': '太白', 'age': 18}
ret = dic.popitem()
print(ret,dic) # ('age', 18) {'name': '太白'}
# clear 清空字典 和 列表是一样的
# dic.clear()
# print(dic) # {}
# del
# del dic['age']
# del dic['age1'] # 没有这个这key的话, 会报错
# print(dic)
# 改
# dic['name'] = 'alex' # 通过key直接改
# print(dic)
# 查
# print(dic['hobby_list'])
# print(dic['hobby_list1']) # key值一定要有, 不然报错
# get
# li = dic.get('hobby_list')
# li = dic.get('hobby', '没有此键') # 可以设置返回值, 第二个参数就是返回值
# print(li) # 没有此键
# 三个特殊的
# keys() values() items()
# print(dic.keys()) # 是一个特殊的类型 dict_keys(['name', 'age', 'hobby_list'])
# print(list(dic.keys())) # 可以转换成list
# for key in dic.keys():
# print(key)
# for key in dic: # 两个结果是一样的
# print(key)
# values()
# print(dic.values()) # 也是一个特殊的类型 (['太白', 18, ['直男', '钢管', '开车']])
# print(list(dic.values())) # 可以转换成list
#
# for value in dic.values():
# print(value)
# items()
# for key, value in dic.items(): # 原理就是元组的拆包
# print(key, value)
# a, b = ('name', 'jack')
# 面试题
# a = 18
# b = 12
# a,b = b,a
# # a,b = 12,18
# print(a,b)
-
相关练习题
dic = {'k1': "v1", "k2": "v2", "k3": [11, 22, 33]}
# 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典
# dic['k4'] = "k4"
# print(dic)
# 请在修改字典中 "k1" 对应的值为 "alex",输出修改后的字典
# dic['k1'] = 'alex'
# print(dic)
# 请在k3对应的值中追加一个元素 44,输出修改后的字典
# dic['k3'].append(44)
# dic.get('k3').append(44)
# print(dic)
# 请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典
# dic['k3'].insert(0, 19)
# print(dic)
-
字典嵌套
dic = {
'name': '汪峰',
'age': 48,
'wife': [{'name': '国际章', 'age': 38}, ],
'children': {'girl_first': '小苹果', 'girl_second': '小怡', 'girl_three': '顶顶'}
}
# 1. 获取汪峰的名字。
# print(dic['name'])
# print(dic.get('name'))
# 2.获取这个字典:{'name':'国际章','age':38}。
# print(dic['wife'][0])
# print(dic.get('wife')[0])
# 3. 获取汪峰妻子的名字。
# print(dic['wife'][0]['name'])
# print(dic.get('wife')[0].get('name'))
# 4. 获取汪峰的第三个孩子名字。
# print(dic['children']['girl_three'])
# 面试题:
l1 = range(5)
print(l1[1:3]) # range(1,3), [1,2] 1, 2 (1, 2)
print(l1[-1])
for i in range(1, 5, -1): # 打印什么都没有
print(i)
-
总结
-
字典: 查询速度快, 数据的关联性强
-
key是不可变(可哈希)的数据类型, (str, int)唯一不可变, 不重复
-
value: 任意数据类型, 对象也可以
-
增删改查是重点
-
字典的嵌套也是重点
-
-
-
字典嵌套练习题
# 练习题
dic1 = {
'name': ['alex', 2, 3, 5],
'job': 'teacher',
'oldboy': {'alex': ['python1', 'python2', 100]}
}
# 1,将name对应的列表追加⼀个元素’wusir’。
# dic1['name'].append('wusir')
# dic1.get('name').append('wusir')
# print(dic1)
# 2,将name对应的列表中的alex⾸字⺟⼤写。
# ret = dic1['name']
# for i in range(len(ret)):
# if type(ret[i]) == str:
# ret[i] = ret[i].capitalize()
# print(ret)
# 3,oldboy对应的字典加⼀个键值对’⽼男孩’,’linux’。
# dic1['oldboy'].setdefault('老男孩', 'linux')
# dic1.get('oldboy').setdefault('老男孩', 'linux')
# print(dic1)
# 4,将oldboy对应的字典中的alex对应的列表中的python2删除
# dic1['oldboy']['alex'].pop(1)
# print(dic1)