14、字典

一、概要

字典是Python语言中唯一的映射类型。在其他语言里例如在c语言里叫 联合内存 ( associative memories )在JavaScript里 联合数组 ( associative arrays ),在java里就是通常所说的map。

序列是以连续的整数为索引,与此不同的是,字典以 key为索引,key可以是任意不可变类型,通常用字符串或数值。如果元组中只包含字符串和数字,它可以做为key,如果它直接或间接的包含了可变对象,就不能当做key。不能用列表做关键字,因为列表可以用索引、切割或者 append()extend() 等方法改变

理解字典的最佳方式是把它看做无序的键: 值对 (key:value 对)集合,键必须是互不相同的(在同一个字典之内)。一对大括号创建一个空的字典: {} 。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式

二、定义字典

  1. 语法格式
    dict1 = {}
    dict1 = {key1:value1,key2:value2,...}
    
  2. 构造方法
    dict2 = dict()  # 用函数
    dict2 = dict(seq)
    
  3. 结构图


    image
  4. 说明
    • 用大括号声明
    • 键与值用冒号“:”分开;
    • 元素与元素用逗号“,”分开;
    • 字典键key可以是任意不可变类型,通常是数字、字符串甚至是元组,使用格式一创建的字典的时候key可以不唯一(不唯⼀,取最后⼀个值,不建议这样写),使用格式二创建的时候 key必须唯一
    • 值可以是任意类型
  5. 示例代码
    #格式一初始化
    user = {'name': 'laowang', 'age': 18, 'sex': '男', 'email': '123@163.com'}
    #格式二初始化
    user =dict({name='laowang', age=18, sex=男, email='123@163.com'})
    #值其它复杂类型
    user =dict({name=['1',2,'hehe'], age=18, sex=男, email='123@163.com'})
    user =dict(address=('北京市','深圳市','武汉市','长沙市'), age=18, sex='男', email='123@163.com')
      #键不唯一 取最后一个
    user = {ame='呵呵',address=('北京市','深圳市','武汉市','长沙市'),address='上海'}
    user =dict({name='呵呵',address=('北京市','深圳市','武汉市','长沙市',address='上海')})
    #错误的写法
    print(user.get('address'))
    

三、获取键值

  1. 语法格式一
    dict[key]
    
  2. 方法
    dict.get(key, default=None)
    
  3. 说明
    通过字典的key取值或者get方法
  4. 参数
    • key
      字典中要查找的键。
    • default
      如果指定键的值不存在时,返回该默认值值。
  5. 返回值
    返回指定键的值,如果值不在字典中返回默认值None
  6. 注意事项
    通过方式一如果获取不存在的键的值就会触发的一个KeyError异常,
    可以使用字典get方法更加安全的获取字典
  7. 示例代码
    user =dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    print(user['name'])
    print(user['aaa']) #直接抛出异常
    print(user.get('address'))#输出元组
    print(user.get('aaa')) #输出None
    print(user.get('aaa','name'))#dict.get(key, default=None)则如果不存在则返回一个默认值,如果设置了则是设置的,否则就是None
    
    In [22]: user =dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='12 3@163.com')
    In [23]: user['name']
    Out[23]: '呵呵'
    In [24]: user['aaa']
    ---------------------------------------------------------------------------
    KeyError                                  Traceback (most recent call last)
    <ipython-input-24-d3b16260a8cd> in <module>()
    ----> 1 user['aaa']
    KeyError: 'aaa'
    

四、添加

  1. 说明
    向字典添加元素,添加元素的方式有两种一种是使用,通过dict[键]=值的方式,但当key存在的时候就是修改的操作
    另外一种调用内置方法
  2. 语法格式
    dict[key] = value
    
  3. 方法
    dict.setdefault(key, value=None)
    
  4. 注意
    通过setdefault方法只能设置在key不存在的时候才会往字典中添加元素,但如果key已经存在了就不会做任何操作
  5. 示例代码
    In [1]: d = {}
    In [2]: d['name'] = "python"
    In [3]: d
    Out[3]: {'name': 'python'}
    
    In [4]: d.setdefault('age',18)
    Out[4]: 18
    In [5]: d
    Out[5]: {'name': 'python', 'age': 18}
    In [6]: d.setdefault('age',19)
    Out[6]: 18
    # age 不是19而是是18说明没有设置成功
    In [7]: d
    Out[7]: {'name': 'python', 'age': 18}
    

五、修改

  1. 语法格式
    dict[key] = value
    
  2. 方法
    dict.update(dict2)
    
  3. 说明
    当key存在的时候可以通过dict[key] = value方式修改元素
  4. 参数说明
    • dict2
      添加到指定字典dict或者可迭代对象到字典中
  5. 示例代码
    user= dict()
    user['name'] = '空空'
    user['age'] = 18 
    user[1] = 2
    print(user)
    
    user= dict()
    user1=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    user.update(user1)
    user.update(phone='110',state=1)#推荐写法
    # 或者
    user.update({phone:'110',state:1})
    print(user)
    

六、字典删除

  1. 语法格式一(不推荐)
    del dict[key] 
    #无返回值
    
  2. 方法
    dict.pop(key[,default])
    
  3. 说明
    删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。如果key不存在直接报错
  4. 参数
    • key:
      要删除的键值
    • default:
      如果key不存在,返回 default 值
  5. 返回值
    返回被删除的值
  6. 示例代码
    user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    del user['name']
    print(user)
    #输出
    {'address': ('北京市', '深圳市', '武汉市', '长沙市'), 'age': 18, 'sex': '男', 'email': '123@163.com'}
    
    user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    name = user.pop('name')
    print(name) #输出 '呵呵'
    key = user.pop('sex','test') #字典存在,返回'男'
    print(key) # '男'
    key = user.pop('key','111') #字典不存在,返回'111'
    print(key)# '111'
    

七 、遍历所有的key

  1. 语法格式
    dict_keys = dict.keys()
    
  2. 说明
    获取所有的key
  3. 返回值
    以列表返回一个字典所有的键
  4. 示例代码
    user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='123@163.com')
    user_keys = user.keys()
    for user_key in user_keys:
        print(user_key) 
    

八、遍历所有的value

  1. 方法
    dict_values = dict.values()
    
  2. 说明
    以列表返回字典中的所有值
  3. 返回值
    返回字典中的所有值
  4. 示例代码
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
    dict_values = user.values()
    for value in dict_values:
        print(value)
    

九、遍历所有的key和value

  1. 方法
    dict_items = dict.items()
    
  2. 说明
    以列表返回可遍历的(键, 值) 元组数组
  3. 返回值
    返回可遍历的(键, 值) 元组数组。
  4. 注意事项
    字典元素的顺序通常没有定义。换句话说,迭代的时候,字典中的键和值都能保证被处理,但是处理顺序不确定。如果顺序很重要的话,可以将键值保存在单独的列表中,例如迭代前进行排序
  5. 示例代码
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
    user_item = user.items()
    print(user_item)
    #dict_items([('name', '呵呵'), ('address', ('北京市', '深圳市', '武汉市', '长沙市')), ('age', 18), ('sex', '男'), ('email', '123@163.com')])
    
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
    user_items = user.items()
    for key, value in user_items:
        print("%s=" % key, value)
        #输出
        name= 呵呵
     address= ('北京市', '深圳市', '武汉市', '长沙市')
     age= 18
     sex= 男
     email= 123@163.com
    
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='123@163.com')
    user_items = user.items()
    keys=[]
    values=[]
    for key, value in user_items:
       keys.append(key)
       values.append(value)
    
  6. 练习
    编写字典程序:
    • 用户添加单词和定义
    • 查找这些单词
    • 如果查不到,请让用户知道
    • 循环
    dictionary = {}
    flag = 'a'
    pape = 'a'
    off = 'a'
    while flag == 'a' or 'c':
        flag = input("添加或查找单词 ?(a/c)")
        if flag == "a":  # 开启
            word = input("输入单词(key):")
            defintion = input("输入定义值(value):")
            dictionary[str(word)] = str(defintion)  # 添加字典
            print("添加成功!")
            pape = input("您是否要查找字典?(a/0)")  # read
            if pape == 'a':
                print(dictionary)
            else:
                continue
        elif flag == 'c':
            check_word = input("要查找的单词:")  # 检索
            for key in sorted(dictionary.keys()):  # yes
                if str(check_word) == key:
                    print("该单词存在! ", key, dictionary[key])
                    break
                else:  # no
                    off = 'b'
            if off == 'b':
                print("抱歉,该值不存在!")
        else:  # 停止
            print("error type")
            break
    

十、其它方法

1、fromkeys

  1. 说明
    用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。
  2. 方法
    dict.fromkeys(seq[, value])
    
  3. 参数
    • seq -- 字典键值列表。
    • value -- 可选参数, 设置键序列(seq)的值
  4. 返回值
    字典对象
  5. 举个栗子
    li = [1, 2, 3]
    dict = dict.fromkeys(li)
    # 带默认值
    dict=dict.fromkeys(li,'默认值')    
    

2、popitem

  1. 说明
    方法随机返回并删除字典中的键值对
  2. 方法
    popitem()
    
  3. 返回值
    键值对的元组形式
  4. 示例代码
    In [1]: dict_num = {'a':1,'b':2,'c':3}
    In [2]: dict_num.popitem()
    Out[2]: ('c', 3)
    

3、copy

  1. 说明
    复制一个字典
  2. 方法
    dict.copy()
    
  3. 示例代码
    In [3]: dict_num = {'a':1,'b':2,'c':3}
    In [4]: copy_dict= dict_num.copy()
    In [5]: copy_dict
    Out[5]: {'a': 1, 'b': 2, 'c': 3}
    In [8]: id(dict_num)
    Out[8]: 4537223856
    In [7]: id(copy_dict)
    Out[7]: 4537295712
    

4、clear

  1. 说明
    删除字典内所有元素
  2. 方法
    dict.clear()
    
  3. 示例代码
    In [3]: dict_num = {'a':1,'b':2,'c':3}
    In [9]: dict_num.clear()
    In [10]: dict_num
    Out[10]: {}
    

十一、字典推导

  1. 说明
    用来快速简洁创建一个新的字典
  2. 语法格式
    dic = {key: value for (key, value) in iterable [if 条件表达式}
    
  3. 举个栗子
    # 案例1
    num_dict= {key: value for i in range(10)}
    print(num_dict)
    # 案例2
    fruit = ['apple', 'banana', 'orange']
    '''
    enumerate在字典上是枚举、列举的意思
    对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),
    enumerate将其组成一个索引序列,
    利用它可以同时获得索引和值
    enumerate多用于在for循环中得到计数,也可指定开始索引
    '''
    dict_result = {key: value for key, value in enumerate(fruit) if len(value) > 5}
    print(dict_result)
    # 案例3 合并key的大小写
    user = {'Name': '赵丽颖', 'age': 18, 'name': '冯提莫', 'Test': 3,'test':'呵呵' }
    new_user = {
        k.lower(): user.get(k.lower(), 0) + user.get(k.upper(), 0 for k in user.keys()
     }
    

十二、字典与序列区别

  1. 存取和访问数据的方式不同。
  2. 序列类型只用数字类型的键(从序列的开始按数值顺序索引);
  3. 字典类型可以用其他对象类型作键(如:数字、字符串、元祖,一般用字符串作键),和序列类型的键不同,字典类型的键直接或间接地和存储数据值相关联。
  4. 字典类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。
  5. 字典类型用键直接“映射”到值。

十三、练习

1、实现通讯录功能

  1. 查询联系人
  2. 添加联系人
  3. 更新联系人
  4. 删除联系人
  5. 退出程序

2、示例代码

contacts = {}  # 定义通讯录
while 1:
    temp = input('请输入指令代码:')
    if not temp.isdigit():
        print("输入的指令错误,请按照提示输入")
        continue
    item = int(temp)  # 转换为数字
    if item == 4:
        print("|---感谢使用通讯录程序---|")
        break
    name = input("请输入联系人姓名:")
    if item == 1:
        if name in contacts:
            print(name, ':', contacts[name])
            continue
        else:
            print("该联系人不存在!")
    if item == 2:
        if name in contacts:
            print("您输入的姓名在通讯录中已存在-->>", name, ":", contacts[name])
            is_edit = input("是否修改联系人资料(Y/N):")
            if is_edit == 'Y':
                phone = input("请输入电话号码:")
                contacts[name] = phone
                print("修改成功")
                continue
            else:
                continue
        else:
            phone = input("请输入联系人电话:")
            contacts[name] = phone
            print("添加成功!")
            continue
    if item == 3:
        if name in contacts:
            del contacts[name]
            print("删除成功!")
            continue
        else:
            print("联系人不存在")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,709评论 0 10
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,712评论 0 8
  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 5,777评论 2 16
  • 1. Python的hello-world: print ("Hello, Python!")、 完了 摇就完事儿...
    LunarShade阅读 1,363评论 0 0
  • 第98页。温馨的一段描述。魔山上的儿子回忆起山下的父亲。 书房是文字的储藏地,是历史与记忆的隐喻。 儿子怀念完父亲...
    简的四季笔记阅读 349评论 3 1