python基础之数据类型III
5.Dictionaries(字典)
5.1字典的认识
-
引子
我已经讲过的数据类型 int float str bool tuple list,我们讲的列表的数据类型有什么缺点?
-
列表数据类型如果存储的数据量较大,查询速度慢。
-
列表容器型数据类型存储的数据之间的关联性不强。
['旋哥', 22, '男', '小金', 22, '男', '唱跳rap篮球']
-
针对于上述的列表的两种缺点,python提供了另一种容器型数据类型,
-
字典dict。字典是以{}括起来,通过键值对的形式存储的容器型数据类型。他存储的数据量没有list的数据量大,但是字典的查询速度非常快,并且字典存储的数据之间的关联性较强。
-
字典从python3.7以后都是有序的。
字典的查询类似于二分查找:每次查询一半,从一半这个数字与目标数字对比,如果比目标数字小,则在从一半与目标数字取一半,在次查询..... 比如,100个数字,我要找到任意一个数字,二分查找算法找不超过2**n > 100 n=7次。
-
-
-
字典的键一定是唯一的,并且是不可变的数据类型,字典的值是任意数据类型。
# 判断以下字典哪个合法? {"name": "barry", 1: 333} {1.4: 666, [1,2]: 777} {(22, 33): 555, 'age': 18} {([11,22]): 34, 1: 1} # { '旋哥': {'name': '旋哥', 'age': 22, 'hobby': '跑步'}, 'name_list': ['小金', '明天', '阿珍'] }
5.2字典的操作
5.2.1字典的创建
-
# 方式一 简单创建 dic1 = {'name': 'Allen', 'age': 25, 'hobby': ['girl', '球类运动', '台球']} # 方式二 dic2 = dict((('one', 1), ('two', 2), ('three', 3))) print(dic2) # 方式三 dic3 = dict(name='Allen', age=25, sex='男') print(dic3)
-
字典的键是唯一的,我们所有的通过字典的操作都是通过键去操作键值对,我们可以把字典的键当做列表的索引。方便你理解。
5.2.2字典的增、改
-
dic1 = {'name': 'Allen', 'age': 25} # 方式一 有责改之,无责增加 # dic1['sex'] = '男' # dic1['name'] = '明哥' # print(dic1) # 方式二 有责改之,无责增加 # dic1.update(sex='男', hobby='girl') # dic1.update({'hobby': ['girl', '球类运动']}) # dic1.update({'name': '天哥', 'hobby': 'run'}) # print(dic1) # 方式三 有则不变,无责增加 # dic1.setdefault('sex', '男') dic1.setdefault('name', '豪哥') print(dic1)
5.2.3字典的删
-
dic1 = {'name': 'Allen', 'age': 25} # 方式一:pop 按照键去删除键值对,返回对应的值 # ret = dic1.pop('name') # print(ret) # 方式二 del # del dic1['name'] # del dic1 # 方式三:clear dic1.clear() print(dic1)
5.2.4字典的查
-
dic1 = {'name': 'Allen', 'age': 25} dic1 = {'name': 'Allen', 'age': 25} # 方式一 直接查询(不推荐) # ret = dic1['name'] # ret = dic1['name1'] # 方式二: get (推荐) # ret = dic1.get('name') # ret = dic1.get('name1') # 还可以设置返回值 # ret = dic1.get('name1', '没有此键') # 方式三 :setdefault 有奇用 # ret = dic1.setdefault('name') ret = dic1.setdefault('name1') print(ret)
-
特殊查询
dic1 = {'name': 'Allen', 'age': 25, 'card': '6217 0001 9000 2473 653'} # for循环遍历 直接循环,循环字典的键 # for i in dic1: # print(i) # 获取字典所有的键 类似于列表,可以转化成列表,也可以直接循环。 # keys = dic1.keys() # dict_keys(['name', 'age', 'card']) # # print(list(keys)) # # print(keys) # for i in keys: # print(i) # 获取字典所有的值 类似于列表,可以转化成列表,也可以直接循环。 # values = dic1.values() # print(list(values)) # print(values) # for val in values: # print(val) # # 获取字典所有的键值对 类似于列表,可以转化成列表,也可以直接循环。 # items = dic1.items() # # print(list(items)) # # print(items) # for i in items: # print(i)
5.3解构
也叫做分别赋值
-
# a = 10 # 变量与值一一对应 # a, b = 10, 20 # print(a,b) # a, b, c = ('Allen', '旋哥', 666) # a, b, c = ['Allen', '旋哥', 666] # print(a, b, c) # a, b = (1, 2, 3) # print(a, b) # 面试题 有变量a = 10, 变量b = 30 用最简单的方法让a,b两个变量的值互换。 a = 10 b = 30 a, b = b, a # a, b = 30, 10 print(a, b) # 延展 dic1 = {'name': 'Allen', 'age': 25, 'card': '6217 0001 9000 2473 653'} # for item in dic1.items(): """ 第一次循环: item = ('name', 'Allen') 第二次循环: item = ('age', 25) ..... """ # print(item) # for key, val in dic1.items(): """ 第一次循环: key, val = ('name', 'Allen') 第二次循环: key, val = ('age', 25) ..... """ # print(key, val)
5.4字典的嵌套
-
dic = { 'name': '阿峰', 'age': 48, 'wife': [{'name': '国际小章', 'age': 38}], 'children': {'girl_first': '苹果', 'girl_second': '小怡怡', 'girl_three': '小顶顶'} } # 1. 获取阿峰的名字。 # print(dic.get('name')) # # 2.获取这个字典:{'name':'国际小章','age':38}。 # lst = dic.get('wife') # print(lst[0]) # 3. 获取阿峰妻子的名字。 # ret = dic.get('wife')[0].get('name') # print(ret) # # 4. 将阿峰的第三个孩子名字改成 xx. # print(dic.get('children')['girl_three']) dic.get('children')['girl_three'] = 'xx' print(dic)
6.Sets(集合)
6.1集合的介绍
-
集合,set,python的基础数据类型,它是以{}括起来,通过逗号隔开的容器型数据类型。集合是无序的,集合要求它里面的数据是不可变的数据类型,并且不能重复,但是集合本身是可变的数据类型。
-
集合的优点:
-
列表去重。
-
关系测试。(测试两个集合的交集,并集,差集,反交集等)
-
-
测试集合的合法性:
# set1 = {10, True, 'Allen', (1, 2, 3)} # print(set1) # # set1 = {10, [1, 2, 3], 'Allen', (1, 2, 3)} # 错误 # set1 = {10, {'name': '小金'}, 'Allen', (1, 2, 3)} # 错误 # print(set1) # 空集合如何显示? # print({}, type({})) set1 = set() print(set1, type(set1))
-
列表的去重
l1 = [1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 6] # 将l1列表进行去重。 # list ---> set set1 = set(l1) print(set1) # set ---> list print(list(set1)) # 将l1列表进行去重(不让使用集合)。 自己想。
6.2集合的常用操作
6.2.1增
-
set1 = {'Allen', '珍哥', '树哥', '姚哥'} # add # set1.add('硕哥') # print(set1) # 迭代着增加 update # set1.update('abc') set1.update([1, 2, 3]) print(set1)
6.2.2删
-
# pop 随机删除有返回值 # ret = set1.pop() # print(ret) # print(set1) # remove 按照元素删除 # set1.remove('聪哥') # print(set1) # clear清空 # set1.clear() # print(set1)
6.2.3改
-
# 先删除后增加 # set1.remove('Allen') # set1.add('男神') # print(set1)
6.2.4查
-
for i in set1: print(i)
6.3集合的关系测试
-
交集、反交集、并集、差集、子集、超集
-
set1 = {1, 2, 3, 4, 5} set2 = {4, 5, 6, 7, 8} # 交集 print(set1 & set2) print(set1.intersection(set2)) # 反交集 print(set1 ^ set2) print(set1.symmetric_difference(set2)) # 并集 print(set1 | set2) print(set1.union(set2)) # 差集 print(set1 - set2) # set1独有的 print(set1.difference(set2)) print(set2 - set1 ) # set2 独有的 # 子集 set1 = {1, 2, 3, 4, 5} set2 = {3, 4, 5} print(set1 > set2) # set1 是set2 超集 print(set1.issuperset(set2)) # set1 是set2 超集 print(set2 < set1) # set2 是set1的子集 print(set2.issubset(set1)) # set2 是set1的子集
-
-
冻集合
-
集合本身是可变的数据类型,我们可以将集合变成不可变的数据类型,将集合冻起来。
-
set2 = {3, 4, 5} set3 = frozenset(set2) # print(set3) print(set(set3)) # dic = {set3: 666} # print(dic)
-