5.1字典資料類型
像清單一樣,“字典”是許多值的集合。但不像清單的下标,字典的索引可以使用許多不同資料類型,不止是整數。字典的索引被稱為“鍵”,鍵及其關聯的值被稱為“鍵-值”對。在代碼中,字典輸入時帶花括号{}。
例如:myCat={'size':'fat','color':'gray','disposition':'loud'}
這将給字典賦給myCat變量。這個字典的鍵是'size'、'color'、'disposition'。這些鍵相應的值是'fat'、'gray'和‘loud'。可以通過他們的鍵通路這些值:
>>>myCat['size']
'fat'
>>'My cat has '+myCat['color']+' fur.'
'My cat has gray fur.'
字典仍然可以用整數值作為鍵,就像清單用整數值作為下标一樣,但是不要求一定要從0開始,可以是任何數字。
5.1.1字典與清單
字典是不排序的,清單是排序的。字典并不能像清單那樣切片。
spam=['cat', 'dogs', 'moose']
bacon=['dogs', 'moose', 'cat']
print(spam==bacon)#output:False
eggs={'name': 'Zophie','species': 'cat','age': '8'}
ham={'species': 'cat','age': '8','name': 'Zophie'}
print(eggs==ham)#output:True
利用程式儲存朋友生日并添加未有過的資訊:
程式終止時,資料丢失,第八章中學習如何儲存資料在硬碟中。
birthdays = {'xu':'10.17','wang':'05.22','zhang':'01.25'}
while True:
print('請輸入要查詢生日的姓名:')
name = input()
if name == '':
break
if name in birthdays:
print(name+'的生日是'+birthdays[name])
else:
print('資料庫中不存在此人的資訊,請輸入生日以便儲存:')
date = input()
birthdays[name] = date
print('資訊已經儲存')
5.1.2keys()、values()和items()方法
他們将傳回類似清單的值,分别對應字典是鍵、值和鍵-值對:keys()、values()和items()。然而,這些方法傳回的不是真正的清單,他們不能被修改,不能應用append()方法。這些資料類型(dict_keys、dict_values和dict_items)可以用于for循環。
spam={'color':'red','age':42}
for v in spam.values():
print(v)
spam={'color':'red','age':42}
for k in spam.keys():
print(k)
for i in spam.items():
print(i)
#輸出為
#red
#42
#color
#age
#('color', 'red')
#('age', 42)
for循環疊代了spam字典中的每個值。for循環也可以疊代每個鍵或者鍵值對:
5.1.3檢查字典中是否存在鍵值
鍵 in 字典名.keys()
值 in 字典名.values()
傳回True或False
5.1.4get()方法
picnicItems={'apples':5,'cups':2}
print('I am bringing '+str(picnicItems.get('cups',0))+' cups.')
print('I am bringing '+str(picnicItems.get('eggs',0))+' eggs.')
'''
output:
I am bringing 2 cups.
I am bringing 0 eggs.
'''
5.1.5setdefault()方法 +5.2漂亮列印
方法get()和setdefault()的差別在于get()不會修原字典值,隻是用來防止錯誤。setdefault()則會修改原字典,為沒有找到值的鍵或者沒有找到的鍵添加預設設定值。
D = {'Name': 'Runoob', 'Age': 7}
print ("Age 鍵的值為 : %s" %D.setdefault('Age','25')) # 鍵存在在字典中則不會設定為指定值
print ("Sex 鍵的值為 : %s" %D.setdefault('Sex', 'NA')) # 鍵不存在,指定一個值
print ("School 鍵的值為 : %s" %D.setdefault('School')) # 鍵不存在,不指定值,預設為None
print ("新字典為:", D)
輸出:
Age 鍵的值為 : 7
Sex 鍵的值為 : NA
School 鍵的值為 : None
新字典為: {'Name': 'Runoob', 'School': None, 'Sex': 'NA', 'Age': 7}
計算一個字元串中每個字元出現的次數:
message = 'It was a bright cold day in April, and the clocks were striking thirteen.'
"""計算message中每個字母出現的次數"""
count = {}
for letter in message:
count.setdefault(letter, 0)
count[letter] = count[letter] + 1
import pprint # 導入pprint 子產品,就可以使用pprint()和pformat()函數,它們将“漂亮列印”一個字典的字。pformat()和pprint一樣 隻是單純擷取其格式不列印
pprint.pprint(count)
pfo = pprint.pformat(count)
5.5課後答案習題
1.空字典的代碼是怎樣的?
答:兩個花括号:{}
2.一個字典包含鍵’fow’和值42,看起來是怎樣的?
答:{‘fow’:42}
3.字典和清單的主要差別是什麼?
答:字典中的表項是不排序的,不能像清單那樣切片,可以用任意值作為鍵
4.如果spam 是{‘bar’: 100},你試圖通路spam[‘foo’],會發生什麼?
答:嘗試通路字典中不存在的鍵,将導緻KeyError 出錯資訊
5.如果一個字典儲存在spam 中,表達式’cat’ in spam 和’cat’ in spam.keys()之間的差別是什麼?
答:沒有差別,‘cat’ in spam 是’cat’ in spam.keys()的簡寫版本,檢查’cat’鍵是否存在于字典中
6.如果一個字典儲存在變量中,表達式’cat’ in spam 和’cat’ in spam.values()之間的差別是什麼?
答:6.‘cat’ in spam 檢查字典中是不是有一個’cat’ 鍵,而’cat’ in spam.values() 檢查是否有一個值’cat’ 對應于 spam 中的某個鍵。
7.下面代碼的簡潔寫法是什麼?
if ‘color’ not in spam:
spam[‘color’] = ‘black’
答:spam.setdefault(‘color’,‘black’)
8.什麼子產品和函數可以用于“漂亮列印”字典值?
答:pprint子產品,pprint()和pformat()函數
1.好玩遊戲的物品清單
寫一個名為displayInventory()的函數,它接受任何可能的物品清單,并顯示如下:
Inventory:
12 arrow
42 gold coin
1 rope
6 torch
1 dagger
Total number of items: 62
stuff={'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}
def displayInventory(inventory):
print("Inventory:")
count=0
for k,v in inventory.items():
print(str(v)+" "+k)
count+=v
print("Total number of items:"+str(count))
displayInventory(stuff)
2.清單到字典的函數,針對好玩遊戲物品清單
假設征服一條龍的戰利品表示為這樣的字元串清單:
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
寫一個名為addToInventory(inventory, addedItems)的函數,其中inventory 參數是一個字典,表示玩家的物品清單(像前面項目一樣),addedItems 參數是一個清單,就像dragonLoot。
addToInventory()函數應該傳回一個字典,表示更新過的物品清單。請注意,清單可以包含多個同樣的項。你的代碼看起來可能像這樣:
def addToInventory(inventory, addedItems):
#your code goes here
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)
displayInventory(inv)
前面的程式(加上前一個項目中的displayInventory()函數)将輸出如下:
Inventory:
45 gold coin
1 rope
1 ruby
1 dagger
Total number of items: 48
解答:
def displayInventory(inventory):
print("Inventory:")
count=0
for k,v in inventory.items():
print(str(v)+" "+k)
count+=v
print("Total number of items:"+str(count))
def addToInventory(inventory, addedItems):
for i in range(len(addedItems)):
if addedItems[i] not in inventory:
inventory.setdefault(addedItems[i],1)
else:
inventory[addedItems[i]]+=1
return inventory
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)
displayInventory(inv)