9.Python基础数据类型之字典

Python基础数据类型之字典

  1. 字典(dict)

    • 虽然列表可以存储大量数据,但由于列表的数据关联性不强,且列表的查询速度比较慢,因此产生了字典;

    • 字典是另一种可变容器模型,且可存储任意类型对象。

    • 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号{ }中 ,格式如下所示:

      d = {key1 : value1, key2 : value2 }
      
      # 字典实例
      d = {"张三":{"年龄":18, "性别":"男"},"李四":{"年龄":20, "性别":"女"}}
      

      其中键必须是唯一的,但值则不必。值可以取任何数据类型,但键必须是不可变的数据类型,如字符串、数字、布尔值或元组。

    • 数据类型的分类(按照可变与不可变进行分类):

      • 可变(不可哈希)的数据类型:列表(list)、字典(dict)、集合(set)
      • 不可变(可哈希)的数据类型:字符串(str)、数值(int)、布尔值(bool)、元组(tuple)
  2. 字典特点

    • 字典在Python 3.5版本及之前版本是无序的。而在Python 3.6版本以后,字典会按照初次建立的顺序排列,但学术上仍然认为Python字典不是有序的。在Python 3.7及以后版本中,字典都是有序的了。
    • 字典的优点:字典查询速度非常快,比列表的查询速度要快的多。可以存储关联性数据。
    • 字典的缺点:空间换时间。字典查询速度快的代价就是浪费空间。
  3. 字典的创建方式

    • 创建一个空字典

      d = dict()
      
    • 方式一(元组的拆包)

      d = dict((("one",1), ("two",2), ("three",3)))
      print(d)
      # 输出结果:{'one': 1, 'two': 2, 'three': 3}
      
    • 方式二(键值对形式)

      d = dict(one=1, two=2, three=3)
      print(d)
      # 输出结果:{'one': 1, 'two': 2, 'three': 3}
      
    • 方式三(官方推荐)

      d = dict({"one":1, "two":2, "three":3})
      print(d)
      # 输出结果:{'one': 1, 'two': 2, 'three': 3}
      
    • 方式四(直接花括号)

      d = {'one': 1, 'two': 2, 'three': 3}
      
    • 方式五(dict.formkeys():字典的键时来自一个可迭代的对象,把可迭代的对象每一个值当作一个键,所有的键共用一个值,正因为所有键都公用一个值,因此,当键值为可变数据类型时,一个键的值更改,其他键的值也会随着更改)

      d = dict.fromkeys([1,2,3],"字典")
      print(d)
      # 输出结果:{1: '字典', 2: '字典', 3: '字典'}
      
      d = dict.fromkeys([1,2,3],[6])
      print(d)
      d[1].append(666)
      print(d)
      '''
      输出结果:
      {1: [6], 2: [6], 3: [6]}
      {1: [6, 666], 2: [6, 666], 3: [6, 666]}
      '''
      
    • 方式六

  4. 字典的增、删、改、查

      • 方式一(直接增加)

        d = {'one': 1, 'two': 2, 'three': 3}
        d['four'] = 4
        print(d)
        # 输出结果:{'one': 1, 'two': 2, 'three': 3, 'four': 4}
        
        # 如果增加的键值对的键与字典中的键重复,则新键值对会覆盖掉原有键值对,也叫“有则改之,无则增加”
        d = {'one': 1, 'two': 2, 'three': 3}
        d['one'] = 4
        print(d)
        # 输出结果:{'one': 4, 'two': 2, 'three': 3}
        
      • 方式二(通过内置函数setdefault增加)

        d = {'one': 1, 'two': 2, 'three': 3}
        d.setdefault('four',4)
        print(d)
        # 输出结果:{'one': 1, 'two': 2, 'three': 3, 'four': 4}
        # 如果增加的键值对的键与字典中的键重复,则新键值对不会覆盖掉原有键值对,也叫“有则不改,无则增加”
        
      • 方式三(通过update方法增加)

        d = {'one': 1, 'two': 2, 'three': 3}
        d.update(four=4,five=5)
        print(d)
        # 输出结果:{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}
        
      • 方式四(通过update方法和元组的拆包增加)

        d = {'one': 1, 'two': 2, 'three': 3}
        d.update([('four',4),('five',5)])
        print(d)
        # 输出结果:{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}
        
      • 方式五(通过update将一个列表更新到另一个列表)

        dict_1 = {'one': 1, 'two': 2, 'three': 3}
        dict_2 = {'one': 0, 'four': 4}
        dict_1.update(dict_2)
        print(dict_1)
        # 输出结果:{'one': 0, 'two': 2, 'three': 3, 'four': 4}
        # update()方法特点:有则改之,无则增加
        
      • 方式一(通过内置函数pop进行删除)(推荐使用此方式)

        d = {'one': 1, 'two': 2, 'three': 3}
        d.pop('three')
        print(d)
        # 输出结果:{'one': 1, 'two': 2}
        # 所有删除方法,只有pop有返回值,返回的值是删除的值
        
        # 当不确定删除的键值在不在字典中,为了防止报错,可以在删除的简直后面增加一个空键值,如果没有要删除的键值,不会报错
        d = {'one': 1, 'two': 2, 'three': 3}
        d.pop('four',"")
        print(d)
        # 输出结果:{'one': 1, 'two': 2, 'three': 3}
        
      • 方式二(通过del方式删除)

        d = {'one': 1, 'two': 2, 'three': 3}
        del d['two']
        print(d)
        # 输出结果:{'one': 1, 'three': 3}
        # 如果删除的键字典中没有会报错,因此不推荐此方法
        
      • 方式三(通过内置函数clear清空字典,并非删除字典)

        d = {'one': 1, 'two': 2, 'three': 3}
        d.clear()
        print(d)
        # 输出结果:{}
        
      • 方式一(直接改)

        d = {'one': 1, 'two': 2, 'three': 3}
        d['one'] = 4
        print(d)
        # 输出结果:{'one': 4, 'two': 2, 'three': 3}
        
      • 方式二(通过update方法改)

        d = {'one': 1, 'two': 2, 'three': 3}
        d.update(one=4)
        print(d)
        # 输出结果:{'one': 4, 'two': 2, 'three': 3}
        
      • 方式一(直接查,不推荐)

        d = {'one': 1, 'two': 2, 'three': 3}
        print(d['three'])
        # 输出结果:3
        # 如果查询的键字典中没有会报错,因此不推荐此方法
        
      • 方式二(通过内置函数get查询)

        d = {'one': 1, 'two': 2, 'three': 3}
        d1 = d.get('two')
        print(d1)
        # 输出结果:2
        # # 如果查询的键字典中没有也不会报错,默认返回值是None,返回值可以设置,因此推荐此方法
        
        d = {'one': 1, 'two': 2, 'three': 3}
        d1 = d.get('four', '没有此键')
        print(d1)
        # 输出结果:没有此键
        
      • 通过内置方法 keys() 查询字典内所有的键

        d = {'one': 1, 'two': 2, 'three': 3}
        print(d.keys())
        # 输出结果:dict_keys(['one', 'two', 'three'])
        
        # 此方式可将键名称转换成列表
        print(list(d.keys()))
        # 输出结果:['one', 'two', 'three']
        
        # 也可以通过for循环列出所有的键
        d = {'one': 1, 'two': 2, 'three': 3}
        for key in d:
            print(i)
        '''
        输出结果:
        one
        two
        three
        '''
        
      • 通过内置方法 values() 查询字典内所有的值

        d = {'one': 1, 'two': 2, 'three': 3}
        print(d.values())
        # 输出结果:dict_values([1, 2, 3])
        
        # 同理,也可以转换成列表及使用for循环列出所有的值
        
      • 通过内置方法 item() 查询所有的键值对

        d = {'one': 1, 'two': 2, 'three': 3}
        print(d.items())
        # 输出结果:dict_items([('one', 1), ('two', 2), ('three', 3)])
        
        # 将键值对转换成列表
        d = {'one': 1, 'two': 2, 'three': 3}
        print(list(d.items()))
        # 输出结果:[('one', 1), ('two', 2), ('three', 3)]
        
        # 使用for循环列出所有的键值对(使用到了元组的拆包)
        d = {'one': 1, 'two': 2, 'three': 3}
        for key,value in d.items():
            print(key,value)
        '''
        输出结果:
        one 1
        two 2
        three 3
        '''
        
  5. 字典的嵌套

    d = {
        '姓名': '张三',
        '性别': '男',
        '配偶':{'姓名': '李四', '性别': '女'},
        '联系方式':[{'手机':12345678, '电话':123456},]
        }
    
    • 获取张三的名字

      print(d.get('姓名'))
      
    • 获取联系方式中的字典

      print(d.get('联系方式')[0])
      
    • 获取手机号

      print(d.get('联系方式')[0].get('手机'))
      
    • 获取配偶的姓名

      print(d.get('配偶').get('姓名'))
      
  6. 字典的for循环

    • 循环一个字典时,如果改变字典的大小(增加或删除元素),就会报错。

      # 将下面字典中所有含t的键值对删掉如何处理呢?
      # 首先我们会想到,循环字典,判断字典的键是否含有"t",可循环字典时改变字典大小就会报错。
      # 那么,我们换种思路,不循环字典时删除键值就好了,只要找到满足有两种方法。
      
      # 方法一:先for循环字典,将满足条件的键放入到一个列表中,然后循环列表,删除满足条件的键值
      d = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
      l = []
      for key in d:
          if 't' in key:
              l.append(key)
      for i in l:
          d.pop(i)
      print(d)
      # 输出结果:{'one': 1, 'four': 4}
      
      # 方法二:通过内置方法keys()生成字典中所有键的列表,然后通过循环键的列表删除满足条件的键值
      d = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
      l = list(d.keys()) # 由于d.keys()生成的列表仍与字典d有关系,直接循环删键值对仍然会报错,因此创建一个新的列表
      for key in l:
          if 't' in key:
              d.pop(key)
      print(d)
      
  7. 字典推导式

    # 将两个列表通过一行代码生成一个字典
    keys = ['a', 'b', 'c']
    values = [1, 2, 3]
    
    dic = {keys[i]:values[i] for i in range(len(keys))}
    
    print(dic)    # {'a': 1, 'b': 2, 'c': 3}
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容