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. 结构图


    14、字典_第1张图片
    image
  4. 说明
    • 用大括号声明
    • 键与值用冒号“:”分开;
    • 元素与元素用逗号“,”分开;
    • 字典键key可以是任意不可变类型,通常是数字、字符串甚至是元组,使用格式一创建的字典的时候key可以不唯一(不唯⼀,取最后⼀个值,不建议这样写),使用格式二创建的时候 key必须唯一
    • 值可以是任意类型
  5. 示例代码
    #格式一初始化
    user = {'name': 'laowang', 'age': 18, 'sex': '男', 'email': '[email protected]'}
    #格式二初始化
    user =dict({name='laowang', age=18, sex=男, email='[email protected]'})
    #值其它复杂类型
    user =dict({name=['1',2,'hehe'], age=18, sex=男, email='[email protected]'})
    user =dict(address=('北京市','深圳市','武汉市','长沙市'), age=18, sex='男', email='[email protected]')
      #键不唯一 取最后一个
    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='[email protected]')
    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 [email protected]')
    In [23]: user['name']
    Out[23]: '呵呵'
    In [24]: user['aaa']
    ---------------------------------------------------------------------------
    KeyError                                  Traceback (most recent call last)
     in ()
    ----> 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='[email protected]')
    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='[email protected]')
    del user['name']
    print(user)
    #输出
    {'address': ('北京市', '深圳市', '武汉市', '长沙市'), 'age': 18, 'sex': '男', 'email': '[email protected]'}
    
    user=dict(name='呵呵',address=('北京市','深圳市','武汉市','长沙市'),age=18, sex='男', email='[email protected]')
    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='[email protected]')
    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='[email protected]')
    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='[email protected]')
    user_item = user.items()
    print(user_item)
    #dict_items([('name', '呵呵'), ('address', ('北京市', '深圳市', '武汉市', '长沙市')), ('age', 18), ('sex', '男'), ('email', '[email protected]')])
    
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='[email protected]')
    user_items = user.items()
    for key, value in user_items:
        print("%s=" % key, value)
        #输出
        name= 呵呵
     address= ('北京市', '深圳市', '武汉市', '长沙市')
     age= 18
     sex= 男
     email= [email protected]
    
    user = dict(name='呵呵', address=('北京市', '深圳市', '武汉市', '长沙市'), age=18, sex='男', email='[email protected]')
    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("联系人不存在")

你可能感兴趣的:(14、字典)