zoukankan      html  css  js  c++  java
  • Python数据类型-04.字典

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据 

    ------------ 完美的分割线 ------------- 

    1.字典引入

    # 为何还要用字典?
    存放一个人的信息:姓名,性别,年龄,很明显是多个值,既然是存多个值,就可以用列表去存放
    但是定义列表的目的不单单是为了存,更重要的是要考虑取值

    info=['xiaoming','male',18]
    info[2]

    以上这种方法是基于我们已经知道在第3个位置存放的是年龄的前提下取出的
    而这完全只是一种假设,并没有真正意义上规定第三个位置存放的是年龄,于是我们需要寻求一种,即可以存放多个任意类型的值,又可以硬性规定值的映射关系的类型,比如key=value,这就用到了字典
    字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。

    2.字典的特性:

    1)字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据
    2)字典是无序的但key键必须唯一且可hash,也就是必须为不可变的数据类型(字符串,元组等)
    python对key进行哈希函数运算,根据计算的结果确定value的存储地址,所以字典是无序存储的,且key必须是可哈希的
    3)字典的value值可以存放任意多个,可修改,可以不唯一
    4)查找速度快,通过hash函数转换为数字(散列值),对之排序后用二分法查找,详细可以查询算法
    5)列表是有序的对象结合,字典是无序的对象集合
    两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

    3.字典的操作

    3.1.创建字典:

    语法:

    dic1 = {"name": "xiaoming", 'age': 18}
    print(dic1)

    dic2 = dict((('name','alex'),))
    dic2 = dict([('name','alex'),('age','18')])        # 键值对以列表或元组表示dic2 = dict([['name','alex'],('age','18')])
    print(dic2)            # 输出结果相同

    3.2.在字典中取值(查询)

    1)dic3.get()方法查找字典中的值

    推荐使用get方法取字典的值,而不是通过key直接取值

    dic3 = {
        'stu01': "xiaozhao",
        'stu02': "laoli",
        'stu03': "dahuang",
    }
    print(dic3['stu01'])        # 直接查询stu01,key存在正常返回
    --->'xiaoming'
    print(dic3['stu05'])        # 如果key不存在就报错,不建议使用
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    KeyError: 'stu05'
    ----------------------
    print(dic3.get('stu01'))        # key存在正常返回
    --->xiaozhao
    print(dic3.get('stu05'))        # key不存在,返回none,建议使用
    --->None

    总结:
    直接查找字典,如果键值对不存在就会报错,所以推荐使用.get()方法

    2)dic3.keys()方法查询字典中所有的键

    print(dic3.keys())        # 打印字典中所有的键,存为一个列表
    --->dict_keys(['stu01', 'stu02', 'stu03'])
    
    print(list(dic3.keys()))        # 将字典中的所有keys转换为一个列表
    --->['stu01', 'stu02', 'stu03']

    3)dic3.values()方法查询字典中所有的值

    print(dic3.values())       # 打印字典中的所有值,存为列表
    --->dict_values(['xiaozhao', 'laoli', 'dahuang'])
    
    print(list(dic3.values()))      # 将字典中的values值转换为一个列表
    --->['dahuang', 'laoli', 'xiaozhao']

    4)dic3.items()方法查询字典中的键值对

    print(dic3.items())        # 把所有键值对以元组的方式存为列表
    --->dict_items([('stu01', 'xiaozhao'), ('stu02', 'laoli'), ('stu03', 'dahuang')])
    
    print(list(dic3.items()))        # 把字典中的所有键值对以元组的方式转换为一个列表
    --->[('stu01', 'xiaozhao'), ('stu02', 'laoli'), ('stu03', 'dahuang')]

    3.3.向字典中增加数据

    dic3['stu04'] = 'Lisa'
    print(dic3)
    --->{'stu01': 'xiaozhao', 'stu02': 'laoli', 'stu03': 'dahuang', 'stu04': 'Lisa'}

    3.4.修改字典中的数据

    dic3['stu03'] = 'XiaoMing'
    print(dic3)
    --->{'stu01': 'xiaozhao', 'stu02': 'laoli', 'stu03': 'XiaoMing', 'stu04': 'Lisa'}

    3.5.判断字典中的某个key是否存在

    print('stu01' in dic3)
    --->True

    3.6.删除字典中的某些数据

    1)dic3.pop()方法删除指定的key

    删除指定的key,并返回被删除的key的value,不指定key,默认随机删除一个

    print(dic3.pop('stu01'))
    print(dic5)
    --->xiaozhao
    --->{'stu02': 'laoli', 'stu03': 'XiaoMing', 'stu04': 'Lisa'}

    2)dic3.popitem()方法随机删除一个键值对

    随机删除一个,并以元组的方式返回被删除的key的value,不建议使用

    print(dic3.popitem())
    print(dic3)
    --->('stu03', 'dahuang')
    --->{'stu01': 'xiaozhao', 'stu02': 'laoli'}

    3)del方法删除字典或者某个键值对

    删除指定的key,不返回数据

    #del dic3                 # 删除整个字典
    del dic3['stu02']        # 删除指定键值对
    print(dic3)
    --->{'stu01': 'xiaozhao', 'stu03': 'dahuang'}

    4)dic3.clear()方法清空字典内容

    返回None

    print(dic3.clear())
    --->None
    print(dic3)
    --->{}

    3.7.dic1.update()方法

    扩展更新,字典相加,有相同key覆盖,没有的key就增加

    dic1={1:2,2:3,3:4,4:5}
    dic2={1:'xiaoming','name':'laowang'}
    dic1.update(dic2)
    print(dic1)
    --->{1: 'xiaoming', 2: 3, 3: 4, 4: 5, 'name': 'laowang'}

    3.8.dic1.setdefault()方法设置默认值

    1)键存在,不改动,返回键对应的值

    ret = dic1.setdefault(1,34)
    print(ret)
    --->xiaoming

    2)键不存在,在字典中增加新的键值对,并返回相应key的值

    ret = dic1.setdefault('hobby','girl')
    print(dic1)
    print(ret)

    3.9.fromkeys()方法批量设置默认值

    创建一个字典,批量设置默认值,有个无法解释的坑,少用

    使用场景:生成一个新员工的字典

    dic3 = {1:2}
    dic4 = dic3.fromkeys(['A','B','C'],'xiaoli')    # 前面的作为新字典的键key,后面的作为新字典各个key的值value
    print(dic4)
    --->{'A': 'xiaoli', 'B': 'xiaoli', 'C': 'xiaoli'}

     4.字典的循环打印

    4.1.循环方法1:键值对打印

    dic1={1:2,2:3,3:4,4:5}
    for k in dic1:
        print(k,dic1[k])

    返回结果:

    1 2
    2 3
    3 4
    4 5

    4.2.循环方法2:转换成列表进行赋值

    很低效,不推荐使用

    dic1={1:2,2:3,3:4,4:5}
    for k,v in dic1.items():
        print(k,v)

    返回结果同上

    5.多级字典嵌套 

    5.1.什么是多级字典嵌套?

    类似以下这种:

    menu = {
        "火车":{"河南省":
                        {"郑州站":{},"漯河站":{},"信阳站":{}},
                "湖北省":
                        {"武汉站":{},"武昌站":{}}},
        "地铁":{"线路11":
                        {"李子园":{},"曹杨路":{},"江苏路":{}},
                "线路9":
                        {"徐家汇":{},"松江新城":{},"九亭":{}}},
        "公交":{"1223":
                        {'荣和怡景园':{},'自来水厂':{},'大渡口':{}},
                "嘉定区间":
                        {'乐购':{},'新玛特':{},'家乐福':{}}}
        }
    View Code

    5.2.多级字典嵌套的应用:三级菜单

    开发环境:

    win10,python3.6.2,pycharm

    开发需求:

    1. 运行程序打印第一级菜单
    2. 选择进入第一级菜单,打印第二级菜单,同理打印第三级菜单
    3. 可以返回上一级菜单
    4. 可以在任意位置退出程序
    5. 菜单数据最好可以保存在文件中

    程序代码:

     1 flag = True
     2 while flag:         #全局变量,设置跳出整个循环
     3     for i in menu:      #遍历第一层字典
     4         print(i)
     5     num_1 = input("请选择>:")
     6     # print(menu.keys())
     7     if num_1 in menu.keys():
     8         while flag:
     9             for i in menu[num_1]:
    10                 print(i)
    11             num_2 = input("请选择>>:")
    12             if num_2 in menu[num_1]:
    13                 while flag:
    14                     for i in menu[num_1][num_2]:
    15                         print(i)
    16                     num_3 = input("请选择>>>:")
    17                     if num_3 in menu[num_1][num_2]:
    18                         print(num_3,'this is you input')
    19                     elif num_3 == 'b':
    20                         break
    21                     else:
    22                         continue
    23             elif num_2 == 'b':
    24                 break
    25             else:
    26                 continue
    27     elif num_1=="b":
    28         exit()
    29     else:
    30         continue
    初级版三级菜单
     1 level =[]
     2 while True:
     3     for key in menu:
     4         print(key)
     5     your_choice = input("your choice >>:").strip()
     6     if your_choice == "b":
     7         if len(level)==0:break      # 当列表空的时候,就是退出大循环的时候
     8         menu=level[-1]
     9         level.pop()              # 删除列表最后一个元素
    10         print(level)
    11         # break
    12     elif your_choice in menu:
    13         # print(menu)
    14         level.append(menu)
    15         # print(level)
    16         menu=menu[your_choice]
    17     else:
    18         continue

    ----------------  完毕,呵呵呵呵 ---------------------

  • 相关阅读:
    LeetCode 1672. 最富有客户的资产总量
    LeetCode 455. 分发饼干
    Linux上安装docker并设置免sudo权限与国内镜像源
    Java后端期末复习
    Windows 10 家庭版开启本地安全策略 关闭管理员权限提升
    C语言中两种交换变量值方法的速度测试
    jQuery动态生成元素无法绑定事件的解决办法
    JQuery绑定事件处理动态添加的元素
    Socket通信服务端和客户端总结
    js传函数指针
  • 原文地址:https://www.cnblogs.com/tssc/p/9415372.html
Copyright © 2011-2022 走看看