返回顶部

字典

一字典(dict) 容器型数据类型

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)

 

posted @ 2022-07-20 16:11  fuju  阅读(73)  评论(0)    收藏  举报