Python-数据类型-04.字典

Python-数据类型-字典

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'),('age','18'),))
dic2 = dict([('name','alex'),('age','18')])     # 键值对以列表或元组表示
dic2 = dict([['name','alex'],('age','18')])
print(dic2)
-------------

3.2.查询

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

-------------
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'))
--->xiaozhao
print(dic5)
--->{'stu02': 'laoli', 'stu03': 'XiaoMing', 'stu04': 'Lisa'}
-----------------------

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

随机删除一个,并以元组的方式返回被删除的key的value,不建议使用
-----------------------
print(dic3.popitem())
--->('stu03', 'dahuang')
print(dic3)
--->{'stu01': 'xiaozhao', 'stu02': 'laoli'}
-----------------------

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

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

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

-----------------------
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)键存在,不改动,返回键对应的值

-----------------------
dic1={1:2,2:3,3:4,4:5}
ret = dic1.setdefault(1,34)
print(ret)
--->xiaoming
-----------------------

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

-----------------------
dic1={1:2,2:3,3:4,4:5}
ret = dic1.setdefault('hobby','girl')
print(dic1)
--->{1: 2, 2: 3, 3: 4, 4: 5, 'hobby': 'girl'}
print(ret)
--->girl
-----------------------

3.9.dic3.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":
                    {'荣和怡景园':{},'自来水厂':{},'大渡口':{}},
            "嘉定区间":
                    {'乐购':{},'新玛特':{},'家乐福':{}}}
    }
----------------------------

5.2.程序开发实例:三级菜单

开发环境:
win10,python3.6.2,pycharm

开发需求:

  1. 运行程序打印第一级菜单
  2. 选择进入第一级菜单,打印第二级菜单,同理打印第三级菜单
  3. 可以返回上一级菜单
  4. 可以在任意位置退出程序
  5. 菜单数据最好可以保存在文件中
------------------------------------
menu = {
    '北京':{
        '海淀':{
            '五道口':{
                'soho':{},
                '网易':{},
                'google':{}
            },
            '中关村':{
                '爱奇艺':{},
                '汽车之家':{},
                'youku':{},
            },
            '上地':{
                '百度':{},
            },
        },
        '昌平':{
            '沙河':{
                '老男孩':{},
                '北航':{},
            },
            '天通苑':{},
            '回龙观':{},
        },
        '朝阳':{},
        '东城':{},
    },
    '上海':{
        '闵行':{
            "人民广场":{
                '炸鸡店':{}
            }
        },
        '闸北':{
            '火车战':{
                '携程':{}
            }
        },
        '浦东':{},
    },
    '山东':{},
}
------------------------------------

程序代码:

-----------初级版-------------
flag = True
while flag: 		#全局变量,设置跳出整个循环
    for i in menu:  	#遍历第一层字典
        print(i)
    num_1 = input("请选择>:")
    # print(menu.keys())
    if num_1 in menu.keys():
        while flag:
            for i in menu[num_1]:
                print(i)
            num_2 = input("请选择>>:")
            if num_2 in menu[num_1]:
                while flag:
                    for i in menu[num_1][num_2]:
                        print(i)
                    num_3 = input("请选择>>>:")
                    if num_3 in menu[num_1][num_2]:
                        print(num_3,'this is you input')
                    elif num_3 == 'b':
                        break
                    else:
                        continue
            elif num_2 == 'b':
                break
            else:
                continue
    elif num_1=="b":
        exit()
    else:
        continue
------------------------------
---------高级精简版---------
level =[]
while True:
    for key in menu:
        print(key)
    your_choice = input("your choice >>:").strip()
    if your_choice == "b":
        if len(level)==0:break  	#当列表空的时候,就是退出大循环的时候
        menu=level[-1]
        level.pop()  		#删除列表最后一个元素
        print(level)
        # break
    elif your_choice in menu:
        # print(menu)
        level.append(menu)
        # print(level)
        menu=menu[your_choice]
    else:
        continue
-----------------------
posted @ 2017-12-16 17:32  天生帅才  阅读(364)  评论(0编辑  收藏  举报
// 百度统计