字典是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','')]) # 键值对以列表或元组表示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":
{"徐家汇":{},"松江新城":{},"九亭":{}}},
"公交":{"":
{'荣和怡景园':{},'自来水厂':{},'大渡口':{}},
"嘉定区间":
{'乐购':{},'新玛特':{},'家乐福':{}}}
}

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

开发环境:

win10,python3.6.2,pycharm

开发需求:

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

程序代码:

 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

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

Python数据类型-04.字典的更多相关文章

  1. python数据类型:字典Dictionary

    python数据类型:字典Dictionary 字典是一种可变容器模型,可以存储任意类型对象 键是唯一的,但是值不需要唯一 值可以取任何数据类型,但是键必须是不可变的,如字符串,数字,元组 创建字典: ...

  2. Python数据类型-6 字典

    字典 Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度.但它是无序的,包含的元素个数不限, ...

  3. Python数据类型(字典和集合)

    1.5 Dictionary(字典) 在Python中,字典用放在花括号{}中一系列键-值对表示.键和值之间用冒号分隔,键-值对之间用逗号分隔. 在字典中,你想存储多少个键-值对都可以.每个键都与一个 ...

  4. python 数据类型三 (字典)

    一.字典的介绍 字典(dict)是python中唯一的一个映射类型,它是以{}括起来的键值对组成,在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将key-value保存 ...

  5. Python数据类型(字典)

    文章内容参考了教程:http://www.runoob.com/python/python-basic-syntax.html#commentform Python 字典(Dictionary) 字典 ...

  6. python数据类型之字典操作

    Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型.一.创建字典字典由key和value成对组成.基本语法如下: infos = {"name&q ...

  7. Python笔记_第一篇_面向过程_第一部分_5.Python数据类型之字典类型(dict)

    字典!在Python中字典是另一种可变容器模型,可以存储任意类型的对象.是Python存储数据类型的最高级(maybe). 特点:1. 字典的存储方式和其他类型数据略有不同,是通过键(key)和值(v ...

  8. Python学习(六) Python数据类型:字典(重要)

    字典dict: 字典其实就相当于java里面的Map,用来存储键值对的.其中存储的数据时无序的. 假如有这样的数据: t1=['name','age','sex'] t2=['tom',30,'mal ...

  9. python 数据类型 之 字典

    python 3.6.5字典的特性和定义定义:{'key_1':vlaue_1,'key_2':value_2}1.键与值用冒号 : 分开2.项与项 用 , 分开 特性1.可以存放多个值,可以不唯一, ...

随机推荐

  1. (转) 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

    一.spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运 ...

  2. eclipse引入httpServlet源码

    eclipse引入httpServlet源码 展开Apache Tomcat v7.0[Apache Tomcat v7.0] -> servlet-api.jar 找到 -> http ...

  3. JavaScript的基础语法

    对于Javascript的而言没有数据类型的全部都是通过var来定义创建的.比如: <!DOCTYPE html> <html> <head> <meta c ...

  4. Linux常用命令实践

    一.开机自动挂载文件系统设置 在/media下新建RHEL目录,并把/dev/sr1第二块光驱挂载到该目录 #mkdir /media/RHEL #mount /dev/sr1 /media/RHEL ...

  5. TED #02#

    Amanda Palmer: The art of asking 1. I think people have been obsessed with the wrong question, which ...

  6. Mysql性能调优工具Explain结合语句讲解

    Explain简称执行计划,可以模拟SQL语句,来分析查询语句或者表结构是否有性能瓶颈.Explain的作用有哪些,可以看到哪些?可以看到表的读取顺序,数据读取操作的操作类型,哪些索引可以使用,哪些索 ...

  7. 【Java----正则关键字转义】

    正则需要转义字符:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'   问题现象:  替换URL格式的字符串时 ...

  8. 近期(17年三月至四月) TODOlist

    前言 今天突然发现好久没有更新博客了,最近确实记录的内容不多,也沉迷Gayhub无法自拔,和那只北极熊愉快的玩耍.不知道为什么记性变差了许多,所以简单的列一个近期的TODOlist给自己一个提醒. T ...

  9. POJ 1637 Sightseeing tour(混合图欧拉回路+最大流)

    http://poj.org/problem?id=1637 题意:给出n个点和m条边,这些边有些是单向边,有些是双向边,判断是否能构成欧拉回路. 思路: 构成有向图欧拉回路的要求是入度=出度,无向图 ...

  10. python 计算阶乘

    # 用for循环计算 n! sum = n=int(input('请输入n=')) ,n+): ,-): sum *= j # sum=sum*j print('%d!=%3d' %(i,sum)) ...