一、字典的初识

  • 为什么要有字典

    字典与列表同属容器型数据类型,同样可以存储大量的数据,但是,列表的数据关联性不强,并且查询速度比较慢,只能按照顺序存储。

  • 什么是字典

    • 先说一下什么叫可变与不可变的数据类型分类

      • 不可变(可哈希)数据类型:int, str, bool, tuple。
      • 可变(不可哈希)数据类型:list, dict, set。
    • 字典是Python语言中的映射类型,他是以{}括起来,里面的内容是以键值对的形式储存的

      • 字典的基本格式

        dic = {'Dylan':
        {'name':'Dylan', 'age': 18, 'sex':'男'},
        'city':['beijing', 'qingdao', 'jiangsu']
        }
        # 这是一个嵌套的字典
      • Key(键):不可变(可哈希)的数据类型,并且键是唯一的,不重复的。

      • value(值):任意数据类型(int, str, bool, tuple, list, dict, set),包括后面要学的实例对象等等。

      • 字典在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) # {'one': 1, 'two': 2, 'three': 3} # 方式三:
    dic = dict({'one': 1, 'two': 2, 'three': 3})
    print(dic) # {'one': 1, 'two': 2, 'three': 3}
  • 字典的合法性

    # 合法
    dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帅哥', '美⼥'], (1, 2, 3): '麻花藤'}
    print(dic[123]) # 456
    print(dic[True]) # 999
    print(dic['id']) # 1
    print(dic['stu']) # ['帅哥', '美⼥']
    print(dic[(1, 2, 3)]) # 麻花藤 # 不合法
    dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不能作为key
    dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key
    dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不能作为key

二、字典的增、删、改、查

  • 字典的增

    • 直接增加 有则改之,无则增加

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic['sex'] = '男' # 原字典里没有这个键值对,所以会新增加这个键值对。
      dic['age'] = 22 # 原字典里己经有这个键了,所以会更改原字典这个键的值。
      print(dic) # {'name': 'Dylan', 'age': 22, 'hobby_list': ['IT', '妹子', '旅行'], 'sex': '男'}
    • dic.setdefault('键','值') 有则不变,无则增加

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic.setdefault('hobby') # 新增一个键,值为空(None)
      dic.setdefault('hobby', '汽车') # 这条是要给 hobby 加个值,但是,上一条己经创建了一个同样的键,所以。这一行的值是不能加进去的,可以用改的方法,改变原来的空值为这一条的值。
      dic.setdefault('age', 33) # 这条跟上一条同理,原字典中己有的键值不会被增加修改。
      print(dic) # {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行'], 'hobby': None}
  • 字典的删

    • dic.pop('键','第二个参数值')

      # pop 按照键删除键值对, 有返回值  ***
      # 设置第二个参数则无论字典中有无此键都不会报错
      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic.pop('name') # 这是 pop 的基本用法
      ret = dic.pop('name') # 删除字典中 name 键 和 Dylan 值,并将删除的值赋值给 ret,但是,由于上一条中己经执行了一次删除 name,这一条找不到原字典中的 name 键,所以.程序会报错.如下:
      ###
      Traceback (most recent call last):
      File "/Users/yaoyaoba/Full_stack_22/day04/练习.py", line 145, in <module>
      ret = dic.pop('name')
      KeyError: 'name'
      ###
      ret1 = dic.pop('hobby','没有此键') # 为了避免报错,通常我们会再加上一个返回参数,可以自定义.格式如些条.
      print(ret) # Dylan
      print(ret1) # 没有此键
      print(dic) # {'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
    • dic.clear() 清空

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic.clear() # 清空字典内的键值对,并留下一个空字典。
      print(dic) # {}
    • del 删除字典中的某个键值对/或者删除整个字典

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      del dic['age']
      print(dic)
      del dic['name1'] # 如果要删除的键没有在字典中,则会报错,所以一般不用这个方法删除键值对。
      ###
      Traceback (most recent call last):
      File "/Users/yaoyaoba/Full_stack_22/day04/练习.py", line 143, in <module>
      del dic[name1]
      NameError: name 'name1' is not defined
      ###
      del dic # 将整个字典删掉
      print(dic) # 打印会报错
      ###
      Traceback (most recent call last):
      File "/Users/yaoyaoba/Full_stack_22/day04/练习.py", line 144, in <module>
      print(dic)
      NameError: name 'dic' is not defined
      ###
  • 字典的改

    • 直接改

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic['age'] = 33 # 将字典中'age'键的值改为'33'
      print(dic)
  • 字典的查

    • 通过键查询

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      print(dic['name']) # Dylan
      # 如果所查的键没在字典里,会报错。
      print(dic['name2'])
      ###
      Traceback (most recent call last):
      File "/Users/yaoyaoba/Full_stack_22/day04/练习.py", line 143, in <module>
      print(dic['name2']) # Dylan
      KeyError: 'name2'
      ###
    • dic.get('键') 查询并返回一个结果,可以赋值给变量

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      v = dic.get('name')
      print(v) # Dylan
      v = dic.get('name1')
      print(v) # None (如果字典中没有这个键,将返回一个空值,避免报错)
      v = dic.get('name2', '没有此键') # 如果字典中没有这个键值对,可以自定义一个反回的值。
      print(v) # 没有此键
  • 字典的三个特殊用法

    • dic.keys() 查找字典中所有的键

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      print(dic.keys(), type(dic.keys())) # dict_keys(['name', 'age', 'hobby_list']) <class 'dict_keys'>
      # 可以转化为列表
      print(list(dic.keys())) # ['name', 'age', 'hobby_list']
      for key in dic.keys():
      print(key) # 打印字典中每个键
      for key in dic:
      print(key) # 打印字典中每个键(等价于上面的方法)
    • dic.values() 查找字典中所有的值

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      print(dic.values()) # dict_values(['Dylan', 18, ['IT', '妹子', '旅行']])
      print(list(dic.values())) # ['Dylan', 18, ['IT', '妹子', '旅行']]
      for value in dic.values():
      print(value) # 打印字典中每个值
    • dic.items() 查找字典中所有的键和值 (以字典包裹元组的形式)

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      print(dic.items()) # dict_items([('name', 'Dylan'), ('age', 18), ('hobby_list', ['IT', '妹子', '旅行'])])
      for key,value in dic.items():
      print('键:', key, '值:' , value)
      # 打印结果:
      键: name 值: Dylan
      键: age 值: 18
      键: hobby_list 值: ['IT', '妹子', '旅行'] # 这里涉及到一个分别赋值的问题:
      面试题:
      a = 18
      b = 12
      a, b = b, a
      # 等价于 a, b = 12, 18
      print(a, b)

三、字典的嵌套

​ 字典的嵌套是非常重要的知识点,这个必须要建立在熟练使用字典的增删改查的基础上,而且字典的嵌套才是咱们在工作中经常会遇到的字典,工作中遇到的字典不是简简单单一层,而就像是葱头一样,一层接一层,但一般都是很有规律的嵌套,那么接下来我们就学习一下字典的嵌套:

dic = {
'name':'汪峰',
'age':48,
'wife':[{'name':'国际章','age':38}],
'children':{'girl_first':'小苹果','girl_second':'小怡','girl_three':'顶顶'}
} 1. 获取汪峰的名字。
2.获取这个字典:{'name':'国际章','age':38}。
3. 获取汪峰妻子的名字。
4. 获取汪峰的第三个孩子名字。 # 解题思路:
# 1.获取汪峰的名字。: 这个比较简单,汪峰就是dic的一个键对应的值,我们通过这个key就可以获取到汪峰这个值。 name = dic['name']
print(name) # 汪峰 # 2. 获取这个字典{'name':'国际章','age':38}: 想要获取这个字典,先要看字典从属于谁?这个字典从属于一个列表,而这个列表是字典wife对应的键,所以咱们应该先通过wife获取到对应的这个列表,然后通过这个列表按照所以取值取到对应的这个字典。 l1 = dic['wife'] # 先获取到这个列表
di = l1[0] # 列表按照索引取值,这个字典是列表的第一个元素,所以通过索引获取到这个字典
print(di) # {'name': '国际章', 'age': 38} # 3. 获取汪峰的妻子名字: 还是按照上一题的思路:想要获取汪峰妻子的名字:国际章,那么他是一个字典的键对应的值,所以我们通过'name'这个键就可以获取到对应的值,这个题的难点是获取到这个小字典,而上一个题我们已经获取了这个小字典,所以在上面的基础上再执行就可以了。 di = dic['wife'][0] # 这个是上一次题获取的小字典的代码
wife_name= di['name'] # 通过小字典然后再通过键就能获取到对应的值
print(wife_name) # 国际章 # 当然咱们可以简化:
wife_name = dic['wife'][0]['name']
print(wife_name) # 国际章 # 4.获取汪峰的第三个孩子名字: 汪峰的孩子们是在一个字典中的,你要想获取汪峰的第三个孩子,你应该先获取到它从属于的这个字典,然后再通过这个字典获取第三个孩子的名字。 dic2 = dic['children'] # 先获取这个字典
name = dic2['girl_three'] # 在通过这个字典获取第三个孩子的名字
print(name) # 顶顶 # 当然你可以简化:
name = dic['children']['girl_three']
print(name) # 顶顶

记录我的 python 学习历程-Day05 字典/字典的嵌套的更多相关文章

  1. 记录我的 python 学习历程-Day13 匿名函数、内置函数 II、闭包

    一.匿名函数 以后面试或者工作中经常用匿名函数 lambda,也叫一句话函数. 课上练习: # 正常函数: def func(a, b): return a + b print(func(4, 6)) ...

  2. 记录我的 python 学习历程-Day02-while 循环/格式化输出/运算符/编码的初识

    一.流程控制之--while 循环 循环就是重复做同一件事,它可以终止当前循环,也可以跳出这一次循环,继续下一次循环. 基本结构(基本循环) while 条件: 循环体 示例 # 这是一个模拟音乐循环 ...

  3. 记录我的 python 学习历程-Day06 is id == / 代码块 / 集合 / 深浅拷贝

    一.is == id 用法 在Python中,id是内存地址, 你只要创建一个数据(对象)那么就会在内存中开辟一个空间,将这个数据临时加载到内存中,这个空间有一个唯一标识,就好比是身份证号,标识这个空 ...

  4. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  5. 记录我的 python 学习历程-Day03 数据类型 str切片 for循环

    一.啥是数据类型 ​ 我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,"汉"是文字,否则它是分 ...

  6. 记录我的 python 学习历程-Day03 列表/元组/rang

    一.列表初识 列表是 Python 的基础数据类型之一,它是以''[ ]''的形式括起来的,每个元素用","隔开,属于容器型数据类型,他可以存放大量的.各种类型的数据. 基本格式 ...

  7. 记录我的 python 学习历程-Day11 两个被忽视的坑、补充知识点、函数名的应用、新版格式化输出、迭代器

    补充知识点 函数形参中默认参数的陷阱 针对不可变数据类型,它是没有陷阱的 def func(name, sex='男'): print(name) print(sex) func('Dylan') # ...

  8. 记录我的 python 学习历程-Day07 基础数据类型进阶 / 数据类型之间的转换 / 基础数据类型总结 / 编码的进阶

    基础数据类型 str(字符串) str:补充方法练习一遍就行 s.capitalize() 首字母大写,其余变小写 s = 'dyLAn' print(s.capitalize()) # Dylan ...

  9. 记录我的 python 学习历程-Day08 文件的操作

    文件操作的初识 用 python 代码对文件进行各种操作. 基本构成: 文件路径:path 打开方式:读.写.追加.读写.写读-- 编码方式:utf-8 / gbk / gb2312-- f = op ...

随机推荐

  1. Unity 简记(1)--TileMap

    ## Tilemap是unity中自带的快速构建2D场景的工具,优点是省时省力, 1 使用方法 在场景创建一个Tilemap 打开TilePalette ​ 3.创建一个新的Palette,将地图切割 ...

  2. kubernetes的ingress-nginx

    这是一篇学习记录.记录kubernetes集群中如何将jenkins服务通过域名接入外部.由于是测试环境,域名是自定义的,解析写在/etc/hosts和自己本地的hosts中. 部署图: 一.部署后端 ...

  3. C++中对封装的语法支持——友元

    友元 1.友元就是授权给某个函数.每个成员函数.某个类具有访问类内部私有成员的权限. 2.为什么用友元?友元可以允许某个类.函数直接访问类内部私有数据,减少函数调用开销,提高效率. 3.友元函数不是成 ...

  4. Batch批处理获取当前时间

    这不是一个新问题,但是由于网上写的都是针对自己的电脑设置,没有通用性,而我呢,又需要在不同电脑上使用,因此,这命题一个问题了.其实也没有什么好说的,直接上代码. @ECHO OFF set split ...

  5. jquery 判断数组是否为空

    jquery 判断数组是否为空 if (data.length === 0) { console.log("数组为空"); }

  6. hdu 1556 Color the ball (技巧 || 线段树)

    Color the ballTime Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. 领扣(LeetCode)第三大的数 个人题解

    给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ...

  8. [UWP]用Win2D实现镂空文字

    1. 前言 之前用PointLight做了一个番茄钟,效果还不错,具体可见这篇文章: [UWP]使用PointLight并实现动画效果 后来试玩了Win2D,这次就用Win2D实现文字的镂空效果,配合 ...

  9. PHP变量的初始化以及赋值方式介绍

    什么是变量 变量通俗的来说是一种容器.根据变量类型不同,容器的大小不一样,自然能存放的数据大小也不相同.在变量中存放的数据,我们称之为变量值. PHP 中的变量用一个美元符号后面跟变量名来表示.变量名 ...

  10. PL真有意思(八):其它程序设计模型

    前言 在之前几篇我们讨论的语法.语义.命名.类型和抽象适用于所有语言.然而我们的注意力都主要集中在命令式语言上,现在这篇来看看其它范式的语言.函数式和逻辑式语言是最主要的非命令式语言. 函数式语言 命 ...