前置意味著將一個或多個元素添加到清單的開頭。雖然 Python 沒有專用的“prepend()”方法,但 提供了多種方法來實現此目的:
numbers = [2, 3, 4]# Using insert(0, element)numbers.insert(0, 1)# [1, 2, 3, 4]# Using list concatenationnumbers = [0] + numbers# [0, 1, 2, 3, 4]`insert()` 方法是 Python 的內置方法,用於在清單中的任何位置添加元素,包括開頭:
fruits = ['orange', 'banana', 'mango']fruits.insert(0, 'apple')print(fruits)# ['apple', 'orange', 'banana', 'mango']# You can also insert multiple timesfruits.insert(0, 'grape')print(fruits)# ['grape', 'apple', 'orange', 'banana', 'mango']- 當需要添加單個元素時- 當代碼可讀性比性能更重要時- 當處理小清單時
使用“+”運算子連接清單是另一種添加元素的常見方法:
colors = ['blue', 'green']# Single element prependcolors = ['red'] + colorsprint(colors)# ['red', 'blue', 'green']# Multiple element prependcolors = ['purple', 'pink'] + colorsprint(colors)# ['purple', 'pink', 'red', 'blue', 'green']這是一個實際的例子,其中前置是有用的 - 維護交易歷史記錄:
class TransactionHistory:def __init__(self):self.transactions = []def add_transaction(self, transaction):# New transactions go at the start - most recent firstself.transactions.insert(0, {'timestamp': transaction['time'],'amount': transaction['amount'],'type': transaction['type']})def get_recent_transactions(self, limit=5):return self.transactions[:limit]# Usage examplehistory = TransactionHistory()history.add_transaction({'time': '2024-03-15 10:30','amount': 50.00,'type': 'deposit'})history.add_transaction({'time': '2024-03-15 14:20','amount': 25.00,'type': 'withdrawal'})recent = history.get_recent_transactions()# Most recent transaction appears first對於需要頻繁添加到大型清單的情況,“collections.deque”是最佳選擇:
from collections import deque# Create a deque from a listnumbers = deque([3, 4, 5])# Prepend single elementsnumbers.appendleft(2)numbers.appendleft(1)# Convert back to list if needednumbers_list = list(numbers)print(numbers_list)# [1, 2, 3, 4, 5]下面是一個比較不同前置方法性能的實際示例:
import timefrom collections import dequedef measure_prepend_performance(size):# Regular list with insertstart = time.time()list_insert = []for i in range(size):list_insert.insert(0, i)list_time = time.time() - start# List concatenationstart = time.time()list_concat = []for i in range(size):list_concat = [i] + list_concatconcat_time = time.time() - start# Dequestart = time.time()d = deque()for i in range(size):d.appendleft(i)deque_time = time.time() - startreturn {'insert': list_time,'concat': concat_time,'deque': deque_time}# Test with 10,000 elementsresults = measure_prepend_performance(10000)for method, time_taken in results.items():print(f"{method}: {time_taken:.4f} seconds")讓我們看看一些可能會讓您陷入困境的情況以及如何處理它們:
# 1. Prepending None or empty listsnumbers = [1, 2, 3]numbers.insert(0, None)# [None, 1, 2, 3] - Validnumbers = [] + numbers # [1, 2, 3] - Empty list has no effect# 2. Prepending to an empty listempty_list = []empty_list.insert(0, 'first')# Works fine: ['first']# 3. Type mixing - be careful!numbers = [1, 2, 3]numbers = ['1'] + numbers# ['1', 1, 2, 3] - Mixed types possible but risky# 4. Modifying list while iteratingnumbers = [1, 2, 3]for num in numbers:numbers.insert(0, num * 2)# Don't do this! Use a new list instead以下是一些基於實際使用方式的具體提示:
# 1. Bulk prepending - more efficient than one at a timeold_items = [4, 5, 6]new_items = [1, 2, 3]combined = new_items + old_items# Better than multiple insert() calls# 2. Converting types safelystring_nums = ['1', '2', '3']numbers = []for num in string_nums:try:numbers.insert(0, int(num))except ValueError:print(f"Couldn't convert {num} to integer")# 3. Maintaining a fixed-size listmax_size = 5recent_items = [3, 4, 5]recent_items.insert(0, 2)if len(recent_items) > max_size:recent_items.pop()# Remove last item if list too long這是一個快速決策指南:
1. 在以下情況下使用“insert(0, element)”:— 正在處理小清單— 代碼清晰是您的首要任務— 只需要偶爾前置
2. 在以下情況下使用清單串聯(`[element] + list`):— 想要最清晰的語法— 一次在前面添加多個元素— 你需要連鎖經營
3. 在以下情況下使用`deque`:— 正在處理大型清單— 性能至關重要— 需要經常添加前綴和附加內容