Python数据类型之字典
浏览量:1043
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号":"分割,每个对之间用逗号“,”分割,整个字典包括在花括号“{}”中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
字典实例:
>>> dict = {'a': '123', 'b': '1234', 'c': '123'}
>>> dict
{'a': '123', 'c': '123', 'b': '1234'}字典操作:
1、查询
>>> dict = {'a': '123', 'b': '1234', 'c': '123'}
>>> dict['a']
'123'如果用字典里没有的键访问数据,会输出错误如下:
>>> dict['d'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'd'
补充:
>>> dict = {'a': '123', 'b': '1234', 'c': '123'}
>>> "a" in dict #标准用法
True
>>> dict.get('a') #获取
'123'2.修改
>>> dict = {'a': '123', 'b': '1234', 'c': '123'}
>>> dict
{'a': '123', 'c': '123', 'b': '1234'}
>>> dict['a']=321 #修改value
>>> dict
{'a': 321, 'c': '123', 'b': '1234'}
>>> dict['a']="d" #修改key
>>> dict
{'a': 'd', 'c': '123', 'b': '1234'}3.删除
>>> dict = {'a': '123', 'b': '1234', 'c': '123'}
>>> del dict['a'] #删除键是a的条目
>>> dict
{'c': '123', 'b': '1234'}
>>> dict.clear(); #清空字典所有条目
>>> dict
{}
>>> del dict #删除整个字典
>>> dict
<type 'dict'>但这会引发一个异常,因为用del后字典不再存在:
>>> dict['a'] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'type' object has no attribute '__getitem__'
补充:
>>> dict = {'a': '123', 'b': '1234', 'c': '123'}
>>> dict.pop('a') #标准删除
'123'
>>> dict
{'c': '123', 'b': '1234'}
>>> dict.popitem() #随机删除
('c', '123')
>>> dict
{'b': '1234'}字典的特性
字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。
两个重要的点需要记住:
1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,如下实例:
>>> dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'};
>>> dict['Name']
'Manni'
#######################补充###############################
>>> dict = {('Name'): 'Zara', 'Age': 7};
>>> dict['Name']
'Zara'2)键必须不可变,所以可以用数,字符串或元组充当,所以用列表就不行,如下实例:
>>> dict = {['Name']: 'Zara', 'Age': 7};
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'方法
1.cmp(dict1,dict2) #比较两个字典元素。
>>> dict1={"a":1}
>>> dict2={"b":2}
>>> cmp(dict1,dict2)
-12.len(dict) #计算字典元素个数,即键的总数
>>> dict1={"a":1}
>>> len(dict1)
13.str(dict) #输出字典可打印的字符串表示。
>>> dict = {'Name': 'Zara', 'Age': 7};
>>> print "Equivalent String : %s" %str(dict)
Equivalent String : {'Age': 7, 'Name': 'Zara'}4.type(variable) #返回输入的变量类型,如果变量是字典就返回字典类型。
>>> dict1={"a":1}
>>> type(dict1)
<type 'dict'>内置函数
1、radiansdict.clear() #删除字典内所有元素
>>> dict = {'a': '123', 'b': '1234', 'c': '123'}
>>> dict.clear();
>>> dict
{}2、radiansdict.copy() #返回一个字典的浅复制
>>> dict1 = {'Name': 'Zara', 'Age': 7};
>>> dict2 = dict1.copy()
>>> dict2
{'Age': 7, 'Name': 'Zara'}3、radiansdict.fromkeys() #创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
>>> seq = ('name', 'age', 'sex')
>>> dict=dict.fromkeys(seq)
>>> dict
{'age': None, 'name': None, 'sex': None}
>>> dict=dict.fromkeys(seq,10)
>>> dict
{'age': 10, 'name': 10, 'sex': 10}4、radiansdict.get(key, default=None) #返回指定键的值,如果值不在字典中返回default值
>>> dict = {'Name': 'ZY', 'Age': 21}
>>> dict.get('Name')
'ZY'
>>> dict.get('Sex',"Never")
'Never'5、radiansdict.has_key(key) #如果键在字典dict里返回true,否则返回false
>>> dict = {'Name': 'ZY', 'Age': 21}
>>> dict.has_key('Name')
True
>>> dict.has_key('Sex')
False6、radiansdict.items() #以列表返回可遍历的(键, 值) 元组数组
>>> dict = {'Name': 'ZY', 'Age': 21}
>>> dict.items()
[('Age', 21), ('Name', 'ZY')]7、radiansdict.keys() #以列表返回一个字典所有的键
>>> dict = {'Name': 'ZY', 'Age': 21}
>>> dict.keys()
['Age', 'Name']8、radiansdict.setdefault(key, default=None) #和get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default
>>> dict = {'Name': 'ZY', 'Age': 21}
>>> dict.setdefault('Age', None)
21
>>> dict
{'Age': 21, 'Name': 'ZY'}
>>> dict.setdefault('Sex', None)
>>> dict
{'Age': 21, 'Name': 'ZY', 'Sex': None}9、radiansdict.update(dict2) #把字典dict2的键/值对更新到dict里
>>> dict1 = {'Name': 'ZY', 'Age': 21}
>>> dict2={'Sex':'F'}
>>> dict1.update(dict2)
>>> dict1
{'Age': 21, 'Name': 'ZY', 'Sex': 'F'}10、radiansdict.values() #以列表返回字典中的所有值
>>> dict1 = {'Name': 'ZY', 'Age': 21}
>>> dict1.values()
[21, 'ZY']补充:循环字典
方法一、
>>> dict1 = {'Name': 'ZY', 'Age': 21,'Sex':'F'}
>>> for key in dict1:
... print(key,dict1[key])
...
('Age', 21)
('Name', 'ZY')
('Sex', 'F')方法二、
>>> dict1 = {'Name': 'ZY', 'Age': 21,'Sex':'F'}
>>> for k,v in dict1.items():
... print(k,v)
...
('Age', 21)
('Name', 'ZY')
('Sex', 'F')***程序练习-三级菜单
要求:
打印省、市、县三级菜单
可返回上一级
可随时退出程序
# -*- conding:utf-8 -*-
#Author:YoungCheung
menu ={
"北京市":{
"东城区":["东华门街道","景山街道","交道口街道","安定门街道","北新桥街道","朝阳门街道","东四街道","建国门街道","东直门街道","前门街道","崇文门外街道","东花市街道","龙潭街道","体育馆路街道","天坛街道","永定门外街"],
"西城区":["西长安街街道"," 新街口街道","月坛街道","展览路街道","德胜街道","金融街街道","什刹海街道","大栅栏街道","天桥街道","椿树街道","陶然亭街道","广内街道","牛街街道","白纸坊街道","广外街道"],
"朝阳区":["建外街道","朝外街道","呼家楼街道","三里屯街道","左家庄街道","香河园街道","和平街街道","安贞街道","亚运村街道","小关街道","酒仙桥街道","麦子店街道","团结湖街道","六里屯街道"],
"丰台区":["右安门街道","太平桥街道","西罗园街道","大红门街道","南苑街道","东高地街道","东铁匠营街道","卢沟桥街道","丰台街道","新村街道","长辛店街道","云岗街道","方庄地区","宛平城地区","马家堡街道","和义街道","卢沟桥地区","花乡地区","南苑地区","长辛店镇","王佐镇"],
"通州区":["中仓街道","新华街道","北苑街道","玉桥街道","永顺街道","梨园街道","宋庄镇","张家湾镇","漷县镇","马驹桥镇","西集镇","台湖镇","永乐店镇","潞城镇","于家务回族乡"],
"石景山区":["八宝山街道","老山街道","八角街道","古城街道","苹果园街道","金顶街街道","广宁街道","五里坨街道","鲁谷街道"],
"海淀区":["万寿路街道","永定路街道","羊坊店街道","甘家口街道","八里庄街道","紫竹院街道","北下关街道","北太平庄街道","学院路街道","中关村街道","海淀街道","青龙桥街道","清华园街道","燕园街道","香山街道","清河街道","花园路街道","西三旗街道","马连洼街道","田村路街道","上地街道","万柳地区","东升地区","曙光街道","温泉镇","四季青镇","西北旺镇","苏家坨镇","上庄镇"],
"房山区":["城关街道","新镇街道","向阳街道","东风街道","迎风街道","星城街道","良乡地区","周口店地区","琉璃河地区","拱辰街道","西潞街道","阎村镇","窦店镇","石楼镇","长阳镇","河北镇","长沟镇","大石窝镇","张坊镇","十渡镇","青龙湖镇","韩村河镇","霞云岭乡","南窖乡","佛子庄乡","大安山乡","史家营乡","蒲洼乡"],
"门头沟区":["大峪街道","城子街道","东辛房街道","大台街道","王平街道","潭柘寺镇","永定镇","龙泉镇","军庄镇","雁翅镇","斋堂镇","清水镇","妙峰山镇"],
"大兴区":["兴丰街道","林校路街道","清源街道","亦庄地区","黄村地区","旧宫地区","西红门镇","瀛海地区","观音寺街道","天宫院街道","青云店镇","采育镇","安定镇","礼贤镇","榆垡镇","庞各庄镇","北臧村镇","魏善庄镇","长子营镇"],
"怀柔区":["怀柔地区","泉河街道","龙山街道","雁栖地区","庙城地区","北房镇","杨宋镇","桥梓镇","怀北镇","汤河口镇","渤海镇","九渡河镇","琉璃庙镇","宝山镇","长哨营满族乡","喇叭沟门满族乡"],
"平谷区":["滨河街道","兴谷街道","渔阳地区","峪口镇","马坊地区","金海湖地区","东高村镇","山东庄镇","南独乐河镇","大华山镇","夏各庄镇","马昌营镇","王辛庄镇","大兴庄镇","刘家店镇","镇罗营镇","黄松峪乡","熊儿寨乡"],
"密云区":["鼓楼街道","果园街道","檀营地区","密云镇","溪翁庄镇","西田各庄镇","十里堡镇","河南寨镇","巨各庄镇","穆家峪镇","太师屯镇","高岭镇","不老屯镇","冯家峪镇","古北口镇","大城子镇","东邵渠镇","北庄镇","新城子镇","石城镇"],
"延庆区":["百泉街道","香水园街道","儒林街道","延庆镇","康庄镇","八达岭镇","永宁镇","旧县镇","张山营镇","四海镇","千家店镇","沈家营镇","大榆树镇","井庄镇","大庄科乡","刘斌堡乡","香营乡","珍珠泉乡"],
"顺义区":["胜利街道","光明街道","仁和街道","后沙峪街道","天竺街道","杨镇街道","牛栏山街道","南法信街道","马坡街道","石园街道","空港街道","双丰街道","旺泉街道","高丽营镇","李桥镇","李遂镇","南彩镇","北务镇","大孙各庄镇","张镇","龙湾屯镇","木林镇","北小营镇","北石槽镇","赵全营镇"],
},
}
print ("++++++++++++++++北京地图查询系统+++++++++++++++++")
for i in menu:
print (i)
jump_flag = False #用于跳出外循环
for i in range(3): #外循环,指定循环3次,3次外循环完了,就退出程序
city_name = input("请输入你要查看的市:")
if city_name in menu:
exist_name = menu[city_name]
district_name = exist_name.keys()#使用输入的信息作为key,取出区信息,存在字典中
while True: #内循环,死循环,不指定循环次数,通过break或者flag跳出
for i in district_name: #遍历列表,取出区名字,打印出来
print (i)
town_name_input = input("请输入你要查看的区:")
if town_name_input in district_name: #判断输入的省名字是否在地区列表中
z_name = menu[city_name][town_name_input] #取出区中有哪些镇,存在列表中
for i in z_name: #遍历列表,取出镇名字,打印出来
print (i)
if town_name_input not in district_name: #如果输入的区名字不在在地区列表中
print ("输入的区名字不对,请重新输入")
continue #跳出当次迭代,开始下一次迭代循环,直到名字输入正确为止(不停的要求输入)
back_or_quit = input("请问是否退出?"
"Back是返回上一级菜单;"
"Exit是退出整个程序")
if back_or_quit == "quit":
jump_flag = True #用于跳出外循环
break #跳出while内循环
if back_or_quit == "back":
continue # 跳出当次迭代,开始下一次迭代循环,重新输入,返回上一步
print ("你输入的信息有误,请重新输入:")
if jump_flag: #跳出外循环的条件满足
break #跳出外循环
else:#上面的3次for循环正常执行完毕,else才会执行,如果是不正常退出(break),else不会执行
print ("3次输入错误,程序退出...........")
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。