天天看點

學習筆記:《python程式設計快速上手-讓繁瑣的工作自動化》(第五章:字典和結構化資料) 5.1字典資料類型

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)