字典是另一種可變容器模型,且可存儲任意類型對象.
一、字典的創建
字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中,
格式如下所示:
dict={key1:value1,key2:value2}
鍵必須是唯一的,但值則不必.不允許同一個鍵出現兩次創建時如果同一個鍵被賦值兩次,後一個值會被記住並且覆蓋上一個值
值可以取任何數據類型,但鍵必須是不可變得如字符串/數字/元組.而列表則不行
二、字典的增刪改查
<1>增;
d['不在d裏的鍵']=值
stus={'張三':16,'李四':19}
dit={'愛好':['吃','燙頭']}
stus['小明']=20
stus['小明']=25#覆蓋上一個值20將不顯示
print(stus)
執行命令得
{'張三': 16, '李四': 19, '小明': 25}
<2>刪:
del d['刪除的鍵']如果不存在就拋異常
pop('刪除的鍵[,default]') default:默認值 如果刪除鍵存在則返回鍵值否則返回默認值
stus={'張三':16,'李四':19}
del stus['張三']#如果無'張三'得鍵則會拋異常
print(stus)
ret=stus.pop('小明1','無此key')#[,default]當刪除的key不存在返回的值系統不拋異常
print(ret)
執行命令得
{'李四': 19}
無此key
<3>改:
d['需要修改的鍵']=值 如果此鍵不存在就變成了增加此鍵
stus={'張三':16,'李四':19}
stus['張三']=20
print(stus)
執行命令得
{'張三': 20, '李四': 19}
<4>查:
d.get('鍵','默認值') 需要查詢的鍵不存在則返回默認值不拋異常
stus={'張三':16,'李四':19}
print('小明年齡',stus.get('小明',不存在))
print('小明年齡',stus.get('小明1',不存在))
print('張三年齡'.stus['張三'])#黨茶渠key不存在時拋異常不建議使用
執行命令得
小明年齡 20
小明1年齡 不存在
張三年齡 16
三、字典的遍歷
len(d)元素個數
d.keys()獲取字典的鍵
values()獲取字典的鍵值
items()得到每個鍵值對得元組 item[0]代表鍵 items[1]代表鍵值
dict={'張三':18,'李四':20}
print(len(dict))
for key in dict.keys():
print(key)
for value in dict.values():
print(value)
for item in dict.items():
print(item[0],item[1])
執行命令得
2
張三
李四
18
20
張三 18
李四 20
練習
(電話通訊錄) 創建2個列表 一個存姓名 一個存手機
=======通訊錄管理系統=======
1.增加姓名和手機
2.刪除姓名
3.修改手機
4.查詢所有用戶
5.根據姓名查找手機號
6.退出
============================
phones={'123':'張三','456':'李四'}
while True:
print('=======通訊錄管理系統=======')
print('1.增加姓名和手機')
print('2.刪除姓名')
print('3.修改手機')
print('4.查詢所有用戶')
print('5.根據姓名查找手機號')
print('6.退出')
print('============================')
num=int(input('請輸入數字:'))
num=int(input('請輸入數字:'))
if num==1:
name=input('請輸入新姓名:')
phone=input('請輸入新電話:')
while phone in phones.keys():
phone=input('電話已存在 請重新輸入:')
phones[phone]=name
print('錄入成功')
elif num==2:
name = input('請輸入姓名:')
for temp in phones.items():
if temp[1].__eq__(name):
phones.pop(temp[0])
print('刪除成功')
break#當兩個名字相同手機號不同時,刪除一個加break 如果都刪除則不加
else:
print('無此用戶')
elif num==3:
phone = input('請輸入電話:')
if phone in phones.keys():
new_phone=input('請輸入新的電話:')
while new_phone in phones.keys():
new_phone=input('電話已存在 請重新輸入新的電話:')
name=phones.pop(phone)
phones[new_phone]=name
print('修改成功')
else:
print('無此電話')
elif num==4:
for temp in phones.items():
print('姓名:'+temp[1],'電話:'+temp[0])
elif num==5:
name = input('請輸入姓名:')
for temp in phones.items():
if temp[1].__eq__(name):
print('姓名:'+temp[1],'電話'+temp[0])
elif num==6:
print('謝謝使用')
break
四、字典的特性
1.不允許同一個鍵出現兩次,創建時如果同一個鍵被賦值兩次,後一個值被記住
2.鍵必須不可變,所以可以用數字/字符串/元祖充當,而不能用列表
和list比較,dict有以下幾個特點:
查找和插入的速度幾塊,不會隨着key得增加而變慢
需要佔用大量的內存,內存浪費多.
hashcode 算法
而list是相反:
查找和插入的時間隨着元素的增加而增加
佔用空間小,浪費內存很少
字典是可以無限嵌套的
citys={
'北京':{
'朝陽':['三里屯','國貿'],
'海淀':['中關村','公主墳'],
'豐臺':['角門西','天台']
},
'河北':{
'廊坊':['大城縣','霸州'],
'石家莊':['橋西區','橋東區'],
}
}
for city in citys.keys():
print(city)
for town in citys.get(city).keys():
print('\t'+town)
print('\t\t'+str(citys.get(city).get(town)))
執行命令得
北京
朝陽
['三里屯', '國貿']
海淀
['中關村', '公主墳']
豐臺
['角門西', '天台']
河北
廊坊
['大城縣', '霸州']
石家莊
['橋西區', '橋東區']
五、字典中的內置函數
序號 | 函數及描述 |
1 | dict.clear() 刪除字典的所有元素 |
2 | dict.copy() 複製一個字典內容 3 |
3 | dict.fromkeys() 創建一個新的字典,以序列seq中元素做字典的鍵,val爲字典所有鍵對應的初始值 |
4 | dict.get(key.default=None) 返回指定鍵的值,如果值不在字典中返回default值 |
5 | key indict 如果建在字典dict例返回true否則返回false |
6 | dict.items() 以列表返回可遍歷的(鍵 .值)元祖數組 |
7 | dict.keys 以列表返回一個字典所有的鍵 |
8 | dict.setdefaulet(key.default=None) 和get() 類似 但如果鍵不存在於字典中,將會添加鍵和值設爲default |
9 | dict.update(dict2) 把字典dict2的鍵/值對更新到dict裏 |
10 | dict.values() 以列表返回字典中的所有值 |
11 | pop(key[.default]) 刪除字典給定健key所對應的值,返回值爲被刪除的值,key值必須給出.否則fanhuidefault |
12 | popitem() 隨機返回並刪除字典中的一對鍵和值(一般刪除末尾對) 不建議使用 |