不靠索引也能提取列表資料

如果不需要更新列表中的資料,我們其實可以用更精簡的語法去遞迴列表。in 關鍵字負責宣告 friend 變數,儲存每一次遞迴所提取的列表資料:

friends = ["Cute Goblin", "Big Goblin", "Small Goblin", "Taipei Goblin"]
for friend in friends:
    print(friend)

# Cute Goblin
# Big Goblin
# Small Goblin
# Taipei Goblin


這種簡潔的語法在尋找列表資料時尤其方便,因為我們只在乎列表的資料值,索引直接捨棄也不用在意,像極了哥布林的愛情:

def contains_small_goblin(friends):
    found = False

    for friend in friends:
        if friend == "Small Goblin":
            found = True

    return found

尋找最大數

這算是個小技巧(?),如果我們想從列表中找出最大數,可以先將初始值宣告為float("-inf"),這樣便能確保列表中每個數字都比它更大。接下來用遞迴陸續找出更大的數值,然後取代它就可以了。

def find_max(nums):
    max_so_far = float("-inf")
    for num in nums:
        if num > max_so_far:
            max_so_far = num

    return max_so_far


同理,若是要找出最小數,將初始值變數宣告為float("inf")即可。


切割列表

我們可以用 : 切割出列表的特定區段,那回傳的會是一個新的列表。除了從哪裡開始、到哪裡結束之外,我們還能指定中間要跳過幾筆資料 (step)。

my_list[ start : stop : step ]


舉個 🌰 :

scores = [50, 70, 30, 20, 90, 10, 50]
print(scores[1:5:2])
# 列印出 [70, 20]

上述案例用中文翻譯:從索引 1 開始,切到索引 4 (不包含 5),中間每 2 個位置跳過。

但其實切割列表不一定要填滿三個條件。比方說 numbers[:3] 代表「從頭開始切到索引 3,但不包含它」。而 numbers[:3] 則表示「從索引 3 開始切到尾端」。

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers[:3] # [0, 1, 2]
numbers[3:] # [3, 4, 5, 6, 7, 8, 9]

雖然平常比較少看到,但也可以只帶入 step,也就是從頭切到尾,中間跳過 x 個位置。

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers[::2] # [0, 2, 4, 6, 8]

 

用負指數來切割列表

有時候我們會想從尾端往前考慮要如何切割列表,剛好 Python 提供了負指數滿足這個需求。舉例來說,numbers[-1] 會切出列表最後一筆資料,而 numbers[-2] 則切出倒數第二筆資料,以此類推。

負指數當然也能結合上述的切割運算式:

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers[-3:] # [7, 8, 9]

合併列表

在 Python 合併列表超簡單,直接用 + 就好,我真的可以這麼幸福嗎?

total = [1, 2, 3] + [4, 5, 6]
print(total)

# [1, 2, 3, 4, 5, 6]

查詢列表

別急,還有更幸福的。在 Python 查詢列表是否含有特定資料,直接用 in 關鍵字即可!回傳值為 True 或是 False

friends = ["Cute Goblin", "Big Goblin", "Small Goblin", "Taipei Goblin"]
print("Cute Goblin" in friends) # True

刪除列表中的資料

Python 提供了 del 關鍵字方便我們移除列表中的資料。我們只需要指定資料的索引位置,或是切割範圍即可。

注意,del 會直接更動 (mutate) 列表中的資料。

# 第四筆資料被刪除
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]

del nums[3]
print(nums)
# [1, 2, 3, 5, 6, 7, 8, 9]

# 從第二筆資料刪除到第三筆資料
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]

del nums[1:3]
print(nums)
# [1, 4, 5, 6, 7, 8, 9]

# 刪除所有資料
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]

del nums[:]
print(nums)
# []