5.1. 字典


除了串列之外,在Python中另一個常被使用的資料結果是字典,在字典中儲存「鍵-值」對 (i.e., key-value pair),即一筆資料包含一組「鍵」及其對應的「值」,其中鍵在字典中是唯一的,但是不同的鍵可以有相同的值。此外,在字典中任兩個「鍵-值」對也不能相同。當建立一個空的字典之後,可以對其做加入、刪除或修改資料等對資料結構的操作。

建立字典

字典可以透過下列幾個方式建立。

>>> d = dict()
>>> d
{}

>>> type(d)
<class 'dict'>

>>> d = {}
>>> d
{}

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d
{1: 2, 3.0: 4.0, '5': '6'}

在字典中的每個鍵是唯一的,不同的鍵可以有相同的值。

>>> d = {1: 2, 3: 4, 1: 5, 6: 4}
>>> d
{1: 5, 3: 4, 6: 4}

使用 len() 取得字典長度

使用 len() 可以得知字典中有幾個「鍵-值」對。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> len(d)
3

加入「鍵-值」對

使用「[ ]」及 = 指派運算子加入「鍵-值」對到字典中。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d[7] = 8.0
>>> d
{1: 2, 3.0: 4.0, '5': '6', 7: 8.0}

使用 in 判斷 key 是否在字典中

想知道某個鍵是否在字典中時,可以使用 in 關鍵字來判斷。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> 1 in d
True

>>> 3.0 in d.keys()
True

>> '7' in d
False

使用 setdefault()時,若某個鍵不在字典中,又想要給它一個預設值時。反之,回傳該鍵的值。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.setdefault(7, 0)
0

>>> d.setdefault(1, 0)
2

使用 key 「存取」資料

要存取字典中的資料時,可以使用鍵或 get() 來取得某個鍵所對應到的值。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d[1]
2

>>> d[3.0]
4.0

>>> d.get('5')
'6'

>>> d[1] = '7'
>>> d
{1: '7', 3.0: 4.0, '5': '6'}

字典中也可以包含其他類型的資料結構。

>>> d = {'list': [1, 2, 3], 'tuple': (5, 6, 7), 'dict': {8: 9, '10': 11}}
>>> d
{'list': [1, 2, 3], 'tuple': (5, 6, 7), 'dict': {8: 9, '10': 11}}

>>> d['list'][0] = 4
>>> d['list']
[4, 2, 3]

>>> d['tuple'] = (5, 6, 7, 8)
>>> d['tuple']
(5, 6, 7, 8)

>>> d['dict'][8] = 12
>>> d['dict']
{8: 12, '10': 11}

使用 keys() 取得所有的「鍵」

使用 keys() 可以取得字典中所有的鍵。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.keys()
dict_keys([1, 3.0, '5'])

>>> type(d.keys())
<class 'dict_keys'>

>>> k = list(d.keys())
>>> k
[1, 3.0, '5']

使用 values() 取得所有的「值」

使用 keys() 可以取得字典中所有的鍵。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.values()
dict_values([2, 4.0, '6'])

>>> type(d.values())
<class 'dict_values'>

>>> v = list(d.values())
>>> v
[2, 4.0, '6']

使用 items() 取得所有的「鍵-值」對

使用 items() 可以得知道字典中所有的「鍵-值」對,當使用 list() 對 items() 的結果做轉換時,會得到元組的串列(i.e, list of tuple)。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.items()
dict_items([(1, 2), (3.0, 4.0), ('5', '6')]

>>> type(d.items())
<class 'dict_items'>

>>> l = list(d.items())
>>> l
[(1, 2), (3.0, 4.0), ('5', '6')]

此外,利用迴圈及多重指派等方式來讀取字典中所有的資料。

d = {1: 2, 3.0: 4.0, '5': '6'}

for a, b in d.items():
    print(a, b)

# 執行結果
1 2
3.0 4.0
5 6

使用 del 關鍵字刪除資料

如果要刪除字典中的資料時,可以使用 del 關鍵字及鍵。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> del d[1]
>>> d
{3.0: 4.0, '5': '6'}

>>> del d[3.0]
>>> d
{'5': '6'}

>>> del d['5']
>>> d
{}

使用 clear() 可以刪除字典中所有的資料,或是使用 = 指派運算子及指派空字典 {} 來達成。

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d.clear()
>>> d
{}

>>> d = {1: 2, 3.0: 4.0, '5': '6'}
>>> d = {}
>>> d
{}

使用 update() 合併字典

當需要合併2個相關資料的字典時,可以使用 update() 來達成。如果要合併的字典中有重複的鍵時,則該「鍵-值」對會覆蓋掉原有的「鍵-值」對。

>>> d1 = {1: 2, 3: 4}
>>> d2 = {'5': '6', 7: 8.0}
>>> d1.update(d2)
>>> d1
{1: 2, 3: 4, '5': '6', 7: 8.0}


>>> d3 = {1: 9, 3: 10.0}
>>> d1.update(d3)
>>> d1
{1: 9, 3: 10.0, '5': '6', 7: 8.0}

牛刀小試

# 步驟1: 處理資料輸入
n = input("")
n = n.strip(" \t\r\n")

# 步驟2: 資料類型轉換
n = int(n)

# 步驟3: 建立摩斯碼(key)及字母(value)的字典
code = {".-": "A",
        "-...": "B",
        "-.-.": "C",
        "-..": "D",
        ".": "E",
        "..-.": "F",
        "--.": "G",
        "....": "H",
        "..": "I",
        ".---": "J",
        "-.-": "K",
        ".-..": "L",
        "--": "M",
        "-.": "N",
        "---": "O",
        ".--.": "P",
        "--.-": "Q",
        ".-.": "R",
        "...": "S",
        "-": "T",
        "..-": "U",
        "...-": "V",
        ".--": "W",
        "-..-": "X",
        "-.--": "Y",
        "--..": "Z"
    }

# 步驟4: 使用 for 迴圈
for i in range(0, n):
    # 步驟5: 處理資料輸入
    s = input("")
    s = s.strip(" \t\r\n")

    # 步驟6: 分割資料
    s = s.split()

    # 步驟7: 使用 for 迴圈對每一個摩斯碼轉換成字母及輸出結果
    for i in range(0, len(s)):
        s[i] = code[s[i]]

    print("".join(s))

躍躍欲試

參考資料

  • Python自動化的樂趣, 第五章, Al Sweigart 著、H&C 譯, 碁峰
  • Python編程入門第3版(簡), 第七章, Toby Donaldson著, 人民郵電出版社
  • 精通Python, 第三章, Bill Lubanovic著, 賴屹民譯, 歐萊禮

results matching ""

    No results matching ""