day2-字典
概述
在本节,我将介绍字典数据类型,它提供了一种灵活的访问和组织数据的方式。然后结合前面关于列表的知识,你将学习如何创建一个数据结构
字典数据类型
定义:字典的索引被称为"键",键及其关联的值称为"键-值"对。
组成部分:字典输入时带花括号{}
>>> user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"}
这个字典的"键"是"name"、"sex"、"age"、"born"
这些键相对应的"值"是:"dick"、"M"、28、"NJ"
可以通过"键"访问这些"值":
>>>user_info["name"] "dick" >>>user_info["sex"] "M" >>>user_info["age"] 28 #字典可以使用任意值作为"键"如:{1212:"Dick"}
字典与列表区别
字典是无序的,列表是有序的,因为无序,所以不能切片key必须是唯一的,所以永久去重
字典中的值和列表一样,是通过方括号访问的
尽管字典是无序的,但是正是使用"键"值"来组织数据,使数据结构化。如:
user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} while True: info = input("Enter a user info:") if info ==" ": break if info in user_info: print(user_info[info] + "is the user info of " + info) else: print("I don't have user info for"+ info) print("what is the user info?") new_value = input() user_info[info] = new_value print("user_info has been updated successfully!")
keys()、values()和items()方法
有3个字典方法,它们将返回类似列表的值,分别对应于字典的"键"、"值"和"键-值"对:
1.键:keys(),返回一个列表
>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} >>>k = user_info.keys() >>>print(k) dict_keys(['sex', 'born', 'name', 'age'])
2.值:values(),返回一个列表
>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} >>>v = user_info.values() >>>print(v) dict_values(['M', 'NJ', 'dick', 28])
3.键-值对:items()
>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} >>>v = user_info.items() >>>print(i) dict_items([('name', 'dick'), ('age', 28), ('born', 'NJ'), ('sex', 'M')]) user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} for x in user_info.items(): print(x) #输出 ('born', 'NJ') ('name', 'dick') ('age', 28) ('sex', 'M')
这些方法返回的值不是列表,也不能被修改。但可以用于for循环
user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} for x in user_info.keys(): print(x) #输出 sex name born age
- 通过传入list()方法将它可转换为列表:
>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} >>>list(user_info) [('name', 'dick'), ('sex', 'M'), ('born', 'NJ'), ('age', 28)]
- 通过循环进行多重赋值:
user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} for x in user_info.items(): for k,v in x: print("i:"+k+ "," + "j:"+str(v))
利用keys(),values()和items()方法,循环分别可以迭代键、值和键-值对。我们可以看到items()方法返回的dict_items值中,包含的是键和值的元组。
检查字典中是否存在键或值
我们知道in 和not in 操作符可以检查值是否存在于列表中。也可以应用在字典中
>>>user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} >>>"name" in user_info.keys() True >>>"M" in user_info.values() True >>>"sex" in user_info "sex" in user_info本质上是一个简写版本。相当于"sex" in user_info.keys()
其他方法
在访问一个键的值之前,检查该键是否存在于字典中,我们知道如果键不在字典中,而我们查询时,会报错,而使用get()方法,可以解决这个问题,下面开始介绍
1.get()
用法:它有两个参数:要取得其值的键,以及如果该键不存在时,返回备用值。
user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} x = "Married(Y/N)" + ":" + user_info.get("status","Y") print(x) #输出 Married(Y/N):Y user_info= {"name":"dick","sex":"M","age":28,"born":"NJ"} x = "Married(Y/N)" + ":" + user_info["status"] print(x) #输出 Traceback (most recent call last): File "/usercode/file3.py", line 3, in x = "Married(Y/N)" + ":" + user_info["status"] KeyError: 'status #因为user_info字典中没有"status"键,get()方法返回的默认值是"Y"。不使用get(),代码就会产生一个错误消息
2.setdefault()
方法是一个很好的快捷方式,可以确保一个键存在
用法:为字典中某个键设置一个默认值,当该键没有任何值时使用它
spam = {'name': 'Pooka', 'age': 5} if 'color' not in spam: spam['color'] = 'black' #传递给该方法的第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键确实存在,方法就会返回键的值。 >>>spam = {'color': 'black', 'age': 5, 'name': 'Pooka'} >>> spam.setdefault('color', 'white') 'black' #当spam.setdefault('color','white')接下来被调用时,该键的值“没有”被改变成'white',因为spam 变量已经有名为'color'的键。
3.修改
user_data = {'huwei':"qawsed123",'admin':"password",'dick':"huwei123"} user_data["huwei"] = "abc123" #修改 print(user_data) #输出 {'huwei':"abc123",'admin':"password",'dick':"huwei123"}
4.添加
user_data = {'huwei':"qawsed123",'admin':"password",'dick':"huwei123"}
user_data["jacky"] = "5566" #增加 print(user_data) #输出 {'huwei':"abc123",'admin':"password",'dick':"huwei123","jacky":"5566"}
5.删除
user_data = {'huwei':"qawsed123",'admin':"password",'dick':"huwei123"} del user_data["huwei"] #删除键是“huwei”的条目 print(user_data) #输出 {'admin':"password",'dick':"huwei123","jacky":"5566"} user_data = user_data user_data.pop("jacky") #删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出 print(user_data) #输出 {'admin':"password",'dick':"huwei123"} user_data = {'admin':"password",'dick':"huwei123","jacky":"5566"} user_data.popitem() #随机返回并删除字典中的一对键和值 print(user_data) #输出 {'admin':"password","jacky":"5566"} user_data = {'admin':"password",'dick':"huwei123","jacky":"5566"} user_data.clear() #清空词典所有条目 print(user_data) #输出 {}
6.len(dict)
用法:计算字典元素个数,即键的总数
dict = {'Name': 'dick', 'Age': 27,'sex':'M'}; print(Length : %d" % len(dict)) #输出 Length : 3
7.copy()
用法:返回一个字典的浅复制
dict1 = {'Name': 'dick', 'Age': 22}; dict2 = dict1.copy() print("New Dictinary: %s" %str(dict2)) #输出 New Dictinary: {'Age': 22, 'Name': 'dick'}
8.update()
用法:把字典dict2的键/值对更新到dict里
dict = {'Name': 'dick', 'Age': 27} dict2 = {'Sex': 'male' } dict.update(dict2) print(dict) #输出 {'Age': 27, 'Name': 'dick', 'Sex': 'male'} #两个字典,有交叉就更新,没有交叉就创建新的
9.fromkeys(seq[,val])
用法:创建一个新字典,以序列seq 中元素做字典的键,val 为字典所有键对应的初始值
c = dict.fromkeys([1,2,3],"well") #初始化一个新的字典 print(c) #输出 {1: 'well', 2: 'well', 3: 'well'}
10.update()
用法:把字典dict2的键/值对更新到dict里
8.update()
用法:把字典dict2的键/值对更新到dict里
8.update()
用法:把字典dict2的键/值对更新到dict里
8.update()
用法:把字典dict2的键/值对更新到dict里
嵌套的字典
列表和字典,他们都可以包含多个值,包括其他列表和字典
字典:把一些项(键)映射到另一些项(值)
列表:只包含一系列有序的值
他们都是通过方括号[]访问表项的
三级菜单实例
#!/usr/bin/env python #-*- coding:utf-8 -*- China = { "华北":{ "北京":{ "东城区":{"安定门街道", "北新桥街道", "东四街道"}, "西城区":{"西长安街街道", "广安门外街道", "椿树街道"}, "朝阳区":{"和平街街道", "将台街道", "左家庄街道"}, }, }, "东北":{ "黑龙江":{ "哈尔滨市":{ "道里区", "南岗区", "香坊区"}, "大庆市":{ "萨尔图区", "龙凤区", "大同区"} }, }, "华东":{ "江苏":{ "南京市":{ "鼓楼区", "建邺区", "白下区"}, "苏州市":{ "相城区", "工业园区", "吴中区"} } } } while True: for f in China: print(f) choice = input("请选择行政区域或选择按q退出:") if choice in China: while True: for i in China[choice]: print(i) choice2 = input("请选择省份区域或选择按m返回上一层:") if choice2 in China[choice]: while True: for s in China[choice][choice2]: print(s) choice3 = input("请选择市级区域或选择按n返回上一层:") if choice3 in China[choice][choice2]: while True: for t in China[choice][choice2][choice3]: print(t) choice4 = input("返回上一层,请按b):") if choice4 == "b": break elif choice3 == "n": break elif choice2 == "m": break elif choice == "q": break #输出 华东 东北 华北 请选择行政区域或选择按q退出:华东 江苏 请选择省份区域或选择按m返回上一层:江苏 南京市 苏州市 请选择市级区域或选择按n返回上一层:南京市 鼓楼区 白下区 建邺区 返回上一层,请按b):b 南京市 苏州市 请选择市级区域或选择按n返回上一层:b 南京市 苏州市 请选择市级区域或选择按n返回上一层:n
循环字典
实现方式1
user_data = {'dick': 'huwei123', 'huwei': 'qawsed123', 'admin': 'password'} for i in user_data: print(i,user_data[i]) #输出 huwei qawsed123 admin password dick huwei123
实现方式2
user_data = {'dick': 'huwei123', 'huwei': 'qawsed123', 'admin': 'password'} for k,v in user_data.items(): #执行分两步,先从字典转换成列表 print(k,v) #输出 huwei qawsed123 admin password dick huwei123
小结:
1.方式1的效率比方式2的效率高很多
2.方式1是直接通过key取value
3.方式2是先把字典转换成一个列表,再去取值
4.当数据量比较大的时候,用第2种方式时,字典转换成列表的这个过程需要花大量的时间作转换,当然数据量不大,没有关系,效率差不多