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种方式时,字典转换成列表的这个过程需要花大量的时间作转换,当然数据量不大,没有关系,效率差不多

浙公网安备 33010602011771号