Python 的列表和字典是兩種常用的資料結構,理解它們的操作技巧對於提升程式碼效率至關重要。列表的排序需要注意修改的是原始列表,需要保留原始列表則需使用 copy 函式。切片操作 [:] 可以靈活地擷取子列表,省略引數或使用負索引能實作更進階的切片操作。列表生成式提供簡潔的元素轉換方式。字典則以鍵值對形式儲存資料,使用 [] 進行存取和修改,pop() 方法移除專案。迭代字典可以使用 for 迴圈搭配鍵值。

在 Python 中,數值格式化能讓資料呈現更符合需求。使用格式化字串可以精確控制小數位數、總長度和長官零,例如 {:.2f}{:7.2f}{:07.2f}。日期時間格式化則仰賴 datetime 模組,利用格式化程式碼如 %Y%m%d%H%M%S 等控制輸出格式。這些技巧能幫助開發者更有效地處理和呈現資料,提升程式碼的可讀性和 maintainability。

列表排序與複製

當您對列表進行排序時,實際上是修改原始列表,而不是傳回排序後的副本。這意味著如果您需要保留原始列表,您必須在排序前使用 copy 函式建立原始列表的副本。

from copy import copy

# 建立原始列表
a = ["it", "was", "the", "best", "of", "times"]

# 建立原始列表的副本
b = copy(a)

# 對副本進行排序
b.sort()

# 顯示原始列表和排序後的副本
print(a)  # ['it', 'was', 'the', 'best', 'of', 'times']
print(b)  # ['best', 'it', 'of', 'the', 'times', 'was']

列表切片

您可以使用 [:] 這種 Python 語法建構來從列表中提取子列表。以下範例傳回一個包含原始列表中從索引 1 到索引 2(不包括索引 2)的元素的列表:

l = ["a", "b", "c", "d"]
print(l[1:3])  # ['b', 'c']

注意,索引位置從 0 開始,因此索引 1 對應於第二個字元,索引 3 對應於第四個字元。然而,切片範圍在高階是排他的,因此本範例中不包括字母 ’d’。

切片的強大功能

[:] 語法實際上非常強大。您可以省略任意一個引數,在這種情況下,起始或結束索引將被假設為適當的值。

l = ["a", "b", "c", "d"]
print(l[:3])  # ['a', 'b', 'c']
print(l[3:])  # ['d']

您還可以使用負索引從列表結尾開始倒數。

l = ["a", "b", "c", "d"]
print(l[-2:])  # ['c', 'd']

對列表應用函式

如果您需要將函式應用於列表的每個元素並收集結果,您可以使用 Python 的綜合語法(comprehensions)。

# 假設我們有一個函式 square(x) 將 x 平方
def square(x):
    return x ** 2

numbers = [1, 2, 3, 4, 5]
squared_numbers = [square(x) for x in numbers]
print(squared_numbers)  # [1, 4, 9, 16, 25]

這種方法提供了一種簡潔高效的方式來轉換列表中的元素。

建立字典

問題描述

您需要建立一個查詢表,以便將值與鍵聯絡起來。

解決方案

使用Python字典。

列表在您需要按順序存取專案列表或始終知道要使用的元素索引時非常方便。另一方面,字典是儲存資料集合的替代方法,但它們的組織方式不同,如圖6-1所示。 圖6-1. Python字典 字典以鍵值對的形式儲存資料,以便您可以使用鍵高效地檢索值,而無需搜尋整個字典。 要建立字典,您可以使用{}符號:

phone_numbers = {'Simon':'01234 567899', 'Jane':'01234 666666'}

討論

在此示例中,字典的鍵是字串,但它們不需要是字串;它們可以是數字或任何資料型別,儘管字串是最常用的。 值也可以是任何資料型別,包括其他字典或列表。以下示例建立了一個字典(a),然後將其用作另一個字典(b)的值:

a = {'key1':'value1', 'key2':2}
print(a)  # 輸出:{'key2': 2, 'key1': 'value1'}
b = {'b_key1':a}
print(b)  # 輸出:{'b_key1': {'key2': 2, 'key1': 'value1'}}

當您顯示字典的內容時,請注意字典中專案的順序可能不匹配建立和初始化字典時指定的順序:

phone_numbers = {'Simon':'01234 567899', 'Jane':'01234 666666'}
print(phone_numbers)  # 輸出:{'Jane': '01234 666666', 'Simon': '01234 567899'}

與列表不同,字典沒有保持專案順序的概念。由於它們的內部表示方式,字典的內容順序將是隨機的。 順序出現隨機是因為底層資料結構是一個雜湊表。雜湊表使用雜湊函式來決定儲存每個值的位置;雜湊函式計算任何物件的數值等效項。 您可以在維基百科上了解更多關於雜湊表的資訊。

內容解密:

上述程式碼示例展示瞭如何建立和操作Python字典。字典是一種非常有用的資料結構,允許您使用鍵高效地儲存和檢索值。透過使用{}符號,您可以建立一個新的字典,並使用鍵值對填充它。字典的鍵和值可以是任何資料型別,包括字串、數字和其他字典或列表。

圖表翻譯:

  graph LR
    A[建立字典] --> B[使用{}符號]
    B --> C[定義鍵值對]
    C --> D[儲存資料]
    D --> E[使用鍵檢索值]

上述Mermaid圖表展示了建立和使用Python字典的過程。從建立字典開始,使用{}符號定義鍵值對,然後儲存資料,最終使用鍵高效地檢索值。

存取字典

問題

您需要在字典中查詢和修改專案。

解決方案

使用Python的索引符號[]。在括號內輸入您需要存取的專案的鍵,如下所示:

phone_numbers = {'Simon':'01234 567899', 'Jane':'01234 666666'}
print(phone_numbers['Simon'])  # 輸出:'01234 567899'
print(phone_numbers['Jane'])  # 輸出:'01234 666666'

討論

查詢過程只有一個方向,即從鍵到值。如果您使用不存在於字典中的鍵,您將會得到一個KeyError。例如:

phone_numbers = {'Simon':'01234 567899', 'Jane':'01234 666666'}
print(phone_numbers['Phil'])  # 引發KeyError

除了使用[]符號來讀取字典中的值外,您還可以使用它來新增新值或覆寫現有的值。以下範例將一個新的鍵值對新增到字典中,鍵為Pete,值為'01234 777555'

phone_numbers = {'Simon':'01234 567899', 'Jane':'01234 666666'}
phone_numbers['Pete'] = '01234 777555'
print(phone_numbers)  # 輸出:{'Simon': '01234 567899', 'Jane': '01234 666666', 'Pete': '01234 777555'}

內容解密:

在上述範例中,我們首先建立了一個字典phone_numbers,其中包含兩個鍵值對。然後,我們使用[]符號來存取字典中的值。當我們嘗試存取不存在的鍵時,Python會引發一個KeyError。最後,我們使用[]符號來新增一個新的鍵值對到字典中。

圖表翻譯:

  flowchart TD
    A[建立字典] --> B[存取值]
    B --> C[新增新值]
    C --> D[更新字典]
    D --> E[輸出更新後的字典]

在這個流程圖中,我們展示瞭如何建立一個字典,存取其值,新增新值,更新字典,最終輸出更新後的字典。

從字典中移除專案

當您需要從字典中移除某個專案時,可以使用 pop() 方法。這個方法不僅能夠移除指定鍵的專案,還會傳回被移除的值。

範例:從字典中移除專案

phone_numbers = {'Simon':'01234 567899', 'Jane':'01234 666666'}
removed_value = phone_numbers.pop('Jane')
print(removed_value)  # 輸出:'01234 666666'
print(phone_numbers)  # 輸出:{'Simon': '01234 567899'}

在這個範例中,pop() 方法成功移除了鍵為 'Jane' 的專案,並傳回了該專案的值。

討論

使用 pop() 方法時,需要注意如果要移除的鍵不存在於字典中,將會引發 KeyError。因此,在實際應用中,可能需要先檢查鍵是否存在於字典中,以避免錯誤。

迭代字典

如果您需要對字典中的每個專案進行某種操作,可以使用 for 迴圈迭代字典的鍵。

範例:迭代字典

phone_numbers = {'Simon':'01234 567899', 'Jane':'01234 666666'}
for name in phone_numbers:
    print(f"{name}: {phone_numbers[name]}")

這個範例展示瞭如何迭代字典的鍵,並透過鍵存取相應的值。

圖表翻譯:

  graph LR
    A[開始] --> B[迭代字典]
    B --> C[存取鍵值]
    C --> D[列印結果]
    D --> E[結束]

內容解密:

在上述範例中,for 迴圈用於迭代字典的鍵。透過迭代,可以對每個鍵值對進行操作。在這個案例中,列印了每個人的姓名和電話號碼。這種方法可以方便地對字典中的所有專案進行遍歷和操作。

進階Python程式設計

7.0 簡介

在本章中,我們將探索Python語言中一些更高階的概念,特別是物件導向Python、讀寫檔案、處理異常、使用模組和網際網路程式設計。

7.1 數字格式化

在Python中,數字格式化是一個非常重要的功能。以下是一個簡單的範例,展示如何使用字典來儲存和格式化資料:

phone_numbers = {'Simon':'01234 567899', 'Jane':'01234 666666'}

for name, num in phone_numbers.items():
    print(name + " " + num)

這個程式碼會輸出:

Jane 01234 666666
Simon 01234 567899

如您所見,字典中的鍵值對不會按照建立的順序儲存。這是字典的一個特性。

其他字典迭代技術

除了上述範例中使用的.items()方法外,還有其他幾種方法可以迭代字典。例如,如果您需要存取值和鍵,可以使用以下形式:

for name, num in phone_numbers.items():
    print(name + " " + num)

這個方法會傳回一個包含鍵值對的迭代器,您可以使用它來存取字典中的值和鍵。

相關內容

所有介於6.12和6.15之間的食譜都涉及使用字典。請參考5.21、6.7和6.11中的for命令。

圖表翻譯:

  graph LR
    A[字典] --> B[鍵值對]
    B --> C[迭代器]
    C --> D[存取值和鍵]
    D --> E[格式化輸出]

這個圖表展示了字典、鍵值對、迭代器和格式化輸出的關係。

內容解密:

在這個範例中,我們使用了字典來儲存電話號碼。字典是一種非常重要的資料結構,在Python中非常常用。透過使用.items()方法,我們可以迭代字典中的鍵值對,並存取值和鍵。這個範例展示瞭如何使用字典來格式化資料和進行迭代。

數值格式化

當您需要將數值格式化為特定的小數位數時,可以使用格式化字串來實作。

範例

x = 1.2345678
print("x={:.2f}".format(x))  # 輸出: x=1.23

在這個範例中,:.2f 是格式化字串,表示將數值格式化為兩位小數。

格式化字串

格式化字串可以包含普通文字和以 {} 界定的標記。標記後面的引數將被替換到標記的位置,根據格式化規範。

格式化規範

格式化規範可以指定數值的格式,例如 :.2f 表示將數值格式化為兩位小數。

複雜範例

如果您需要將數值格式化為特定的總長度,可以在小數點前新增另一個數字,例如 {:7.2f} 表示將數值格式化為七位長度,兩位小數。

x = 1.2345678
print("x={:7.2f}".format(x))  # 輸出: x= 1.23

如果您需要將數值格式化為長官零,可以使用 0 作為填充字元,例如 {:07.2f} 表示將數值格式化為七位長度,兩位小數,長官零。

x = 1.2345678
print("x={:07.2f}".format(x))  # 輸出: x=0001.23

溫度轉換範例

以下範例顯示如何使用格式化字串來顯示溫度在攝氏和華氏度之間的轉換:

c = 20.5
print("Temperature {:5.2f} deg C, {:5.2f} deg F.".format(c, c * 9 / 5 + 32))
# 輸出: Temperature 20.50 deg C, 68.90 deg F.

在這個範例中,{:5.2f} 表示將數值格式化為五位長度,兩位小數。

格式化數字和日期時間

在 Python 中,格式化數字和日期時間是一個常見的需求。下面,我們將探討如何使用格式化方法來顯示數字和日期時間。

格式化數字

您可以使用 format() 方法來格式化數字。例如,要顯示一個數字的十六進位制和二進製表示,可以使用以下程式碼:

print("{:X}".format(42))  # 輸出:2A
print("{:b}".format(42))  # 輸出:101010

這裡,{:X}{:b} 分別是十六進位制和二進位制的格式化程式碼。

格式化日期時間

要格式化日期時間,可以使用 datetime 模組的 datetime 類別,並將其格式化為字串。例如:

from datetime import datetime

d = datetime.now()
print("{:%Y-%m-%d %H:%M:%S}".format(d))  # 輸出:2015-12-09 16:00:45

這裡,{:%Y-%m-%d %H:%M:%S} 是日期時間的格式化程式碼,其中:

  • %Y 代表四位數年的格式
  • %m 代表月份的格式
  • %d 代表日的格式
  • %H 代表小時的格式
  • %M 代表分鐘的格式
  • %S 代表秒的格式

圖表翻譯:

  flowchart TD
    A[開始] --> B[格式化數字]
    B --> C[使用 format() 方法]
    C --> D[顯示十六進位制和二進位制]
    D --> E[結束]
    
    F[開始] --> G[格式化日期時間]
    G --> H[使用 datetime 模組]
    H --> I[顯示日期時間]
    I --> J[結束]

圖表翻譯:

上述圖表展示了格式化數字和日期時間的流程。首先,開始格式化數字,然後使用 format() 方法來顯示十六進位制和二進位制。接下來,開始格式化日期時間,使用 datetime 模組來顯示日期時間。

內容解密:

在上述程式碼中,我們使用了 format() 方法來格式化數字和日期時間。這個方法可以讓我們自定義輸出的格式。例如,{:X}{:b} 分別是十六進位制和二進位制的格式化程式碼。對於日期時間, 我們使用了 datetime 模組的 datetime 類別,並將其格式化為字串。這個方法可以讓我們自定義日期時間的輸出格式。

從使用者經驗視角來看,Python 提供了簡潔而強大的列表和字典操作方法。列表的排序、切片和函式應用,結合字典的建立、存取、修改和刪除,極大提升了開發效率。然而,需要注意列表排序的原地修改特性,必要時需使用 copy() 函式避免意外修改原始資料。同時,字典的無序性也需要開發者特別留意,避免依賴其順序進行操作。展望未來,隨著 Python 的持續發展,預計這些核心資料結構的操作將更加最佳化,並與新的語言特性深度整合,例如型別提示的更廣泛應用,可以進一步提升程式碼的可讀性和安全性。對於追求高效開發的 Python 工程師而言,深入理解並熟練運用這些列表和字典操作技巧至關重要。玄貓認為,掌握這些基礎知識,並持續關注 Python 的發展趨勢,將有助於開發者更好地應對日益複雜的軟體開發挑戰。