字典是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. http-从域名到页面

    目录 1. 网络基础 TCP/IP HTTP DNS URI, URL, and URN URI的格式 2. HTTP简单概括 通过实例看HTTP HTTP报文组成 3. 使用Firefox修改请求首 ...

  2. Which adidas NMD Singapore is your favorite

    The adidas NMD Singapore just keeps the hits coming this fall with another change that's sure to bec ...

  3. link标签 rel="stylesheet"

    首先,link标签是用于当前文档引用外部文档的,其次,这个标签的rel属性用于设置对象和链接目的间的关系,说白了就是指明你链进来的对象是个什么东西的,具体的值及其所表示的关系如下:Alternate: ...

  4. 53. Maximum Subarray(动态规划 求最大子数组)

      Find the contiguous subarray within an array (containing at least one number) which has the larges ...

  5. 最佳虚拟容器LXC

    最佳虚拟容器LXC 和"真正的虚拟机环境"不同, "容器"(container)只能在Linux上虚拟Linux, 不能虚拟WIndows, 因为它不能虚拟硬件 ...

  6. nodejs+express工程 在npm install之后或使用npm install bootstrap命令安装bootstrap之后

    nodejs+express工程 在npm install之后或使用npm install bootstrap命令安装bootstrap之后引入bootstrap文件 如果你的静态资源存放在多个目录下 ...

  7. springcloud13---zuul

    Zuul:API  GATEWAY (服务网关): http://blog.daocloud.io/microservices-2/ 一个客户端不同的功能请求不同的微服务,那么客户端要知道所有微服务的 ...

  8. 如何让.gitignore文件生效

    改动过.gitignore文件之后,在repo的根目录下运行 # 先将当前仓库的文件的暂存区中剔除 git rm -r --cached . # 再添加所有的文件到暂存区,这时.gitignore文件 ...

  9. UVALive - 2927 "Shortest" pair of paths(最小费用最大流)题解

    题意:有n个机器,机器之间有m条连线,我们需要判断机器0到n-1是否存在两条线路,存在输出最小费用. 思路:我们把0连接超级源点,n-1连接超级汇点,两者流量都设为2,其他流量设为1,那么只要最后我们 ...

  10. 原生DOM操作vs框架虚拟DOM比较

    1. 原生 DOM 操作 vs. 通过框架封装操作. 这是一个性能 vs. 可维护性的取舍.框架的意义在于为你掩盖底层的 DOM 操作,让你用更声明式的方式来描述你的目的,从而让你的代码更容易维护.没 ...