目錄
- 1. 元組(Tuple)??
- 2. 列表(List)?
- 3. 字典(Dict)
- 4. 集合(Set)??
- 5. 字符串(Str)
- 6. 隊列(Queue)與棧(Stack)?
- 6.1. 數據訪問方式
- 6.1.1 隊列(Queue)
- 6.1.2 棧(Stack)
- 6.2. 應用場景
- 6.3. 實現方式
- 6.4. 內存結構
- 6.5. 性能
- 總結:數據結構對比表
1. 元組(Tuple)??
元組是一種??不可變??的有序序列,用于存儲固定數據。適用于需要數據保護或哈希的場景(如字典的鍵)。
# 1、創建元組
# 可以使用圓括號 () 或者內置的 tuple() 函數來創建元組
empty_tuple = () # 空元組
single_element = (1,) # 單元素元組(需逗號)
multi_elements = (1, "a", 3.14)# 使用 tuple() 函數創建元組
from_list = tuple([4, 5, 6]) # 從列表創建元組
from_string = tuple('abc') # 從字符串創建元組 ,輸出('a', 'b', 'c')# 2、雙向訪問與切片
# 元組支持切片操作,用于獲取元組的子集
# 切片操作使用 [start:stop:step] 的語法
print(multi_elements[0]) # 輸出: 1
print(multi_elements[-1]) # 輸出: 3.14
print(multi_elements[1:3]) # 輸出: ('a', 3.14)
print(multi_elements[0::2]) # 輸出:(1, 3.14) # 3、不可變性示例
try:multi_elements[0] = 10
except TypeError as e:print(f"錯誤: {e}") # 輸出: 元組不可修改 # 4、常用方法
# 元組只有兩個內置方法:count() 和 index()
# count():用于返回指定元素在元組中出現的次數
# index():用于返回指定元素在元組中第一次出現的索引,如果元素不存在則引發 ValueError
count = multi_elements.count(1) # 統計元素在元組中出現次數
index = multi_elements.index("a") # 查找元素索引
print(count, index) # 輸出: 1 1 # 5、元組的解包
# 可以將元組中的元素解包到多個變量中
my_tuple = (10, 20, 30)
a, b, c = my_tuple
print(a) # 輸出10
print(b) # 輸出20
print(c) # 輸出30# 6、元組作為函數返回值
# 函數可以返回一個元組,方便同時返回多個值
def get_name_and_age():return 'Alice', 25name, age = get_name_and_age()
print(name)
print(age)# 7、元組的遍歷
my_tuple = (1, 2, 3, 4, 5)
for element in my_tuple:print(element)
2. 列表(List)?
列表是??可變??的有序集合,支持動態增刪改,適合存儲動態數據。與元組不同,列表的元素可以被修改、添加或刪除。
# 1、創建列表
my_list = [1, "a", 3.14]
from_range = list(range(3)) # [0, 1, 2] # 2、訪問與切片
my_list = [10, 20, 30, 40, 50]
first_element = my_list[0] # 訪問第一個元素
last_element = my_list[-1] #訪問最后一個元素
subset = my_list[1:3] # 獲取從索引 1 到索引 3(不包含)的元素
every_second = my_list[0::2] # 獲取從索引 0 到末尾,步長為 2 的元素# 3、增刪改操作
# 可以使用 append()、extend() 和 insert() 方法來添加元素
# 可以使用 remove()、pop() 和 del 語句來刪除元素
my_list = [10, 10, 20, 30, 40, 50]my_list.append(4) # 末尾添加
my_list.extend([5, 6]) # 擴展列表,將另一個可迭代對象的元素添加到列表末尾
my_list.insert(1, 15) # 在指定索引位置插入一個元素my_list[1] = 20 # 修改元素
my_list.remove(20) # 刪除指定值的第一個匹配項
popped_element = my_list.pop(1) # 刪除指定索引位置的元素,并返回該元素
del my_list[0] # 刪除索引0的元素
print(my_list) # [20, 30, 40, 50, 4, 5, 6]# 4、切片與遍歷
my_list = [10, 10, 20, 30, 40, 50]
print(my_list[::2]) # 輸出: [10, 20, 40]
for idx, val in enumerate(my_list):print(f"索引{idx}: {val}") # 5、常用方法
# 列表還有 count()、index()、sort()、reverse() 等方法
my_list = [1, 2, 2, 3, 2]
count_2 = my_list.count(2) # 統計元素 2 出現的次數
index_3 = my_list.index(3) # 查找元素 3 第一次出現的索引
my_list.sort() # 對列表進行排序
my_list.reverse() # 反轉列表
print(count_2) # 3
print(index_3) # 3
print(my_list) # [3, 2, 2, 2, 1]# 6、列表的遍歷
my_list = [1, 2, 3, 4, 5]
for element in my_list:print(element)# 7、列表推導式
# 創建一個包含 1 到 5 的平方的列表
# 列表推導式是一種簡潔的創建列表的方式
squares = [i ** 2 for i in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
3. 字典(Dict)
字典(dict)是一種無序、可變且以鍵值對形式存儲數據的數據結構。字典是??鍵值對??的無序集合(Python 3.7+ 有序),支持快速查詢。
# 1、創建字典
# 可以使用花括號 {} 或者內置的 dict() 函數來創建字典
empty_dict = {} # 空字典
simple_dict = {'name': 'Alice', 'age': 25} # 包含鍵值對的字典
from_tuples = dict([('city', 'New York'), ('country', 'USA')])
from_kwargs = dict(name='Bob', age=30)# 2、訪問字典元素
# 可以通過鍵來訪問字典中的值。如果鍵不存在,直接訪問會引發 KeyError
# 解決辦法在下段落,此處先不談
my_dict = {'name': 'Alice', 'age': 25}
name = my_dict['name'] # 通過鍵訪問值
city = my_dict.get('city') # 使用 get() 方法訪問值,如果鍵不存在,返回默認值(這里是 None)# 3、增刪查改
my_dict = {'name': 'Alice', 'age': 25}
my_dict['age'] = 26 # 修改已有鍵的值
my_dict['city'] = 'New York' # 添加新的鍵值對
print(my_dict) # {'name': 'Alice', 'age': 26, 'city': 'New York'}
del my_dict['city'] # 使用 del 語句刪除指定鍵的鍵值對
age = my_dict.pop('age') # 使用 pop() 方法刪除指定鍵的鍵值對,并返回該鍵對應的值
print(my_dict) # {'name': 'Alice'}# 4、遍歷鍵值
for key, value in person.items():print(f"{key}: {value}") # 5、常用方法
# keys():返回一個包含字典所有鍵的視圖對象。
# values():返回一個包含字典所有值的視圖對象。
# items():返回一個包含字典所有鍵值對的視圖對象。
# update():將另一個字典的鍵值對更新到當前字典中
my_dict = {'name': 'Alice', 'age': 25}
keys = my_dict.keys() # 獲取所有鍵
values = my_dict.values() # 獲取所有值
items = my_dict.items() # 獲取所有鍵值對
new_dict = {'city': 'Bei Jing'} # 更新字典
my_dict.update(new_dict)
print(keys) # dict_keys(['name', 'age', 'city'])
print(values) # dict_values(['Alice', 25, 'Bei Jing'])
print(list(values)) # ['Alice', 25, 'Bei Jing']
print(items) # dict_items([('name', 'Alice'), ('age', 25), ('city', 'Bei Jing')])
print(my_dict) # {'name': 'Alice', 'age': 25, 'city': 'Bei Jing'}# 6、字典推導式
# 創建一個包含 1 到 5 的平方的字典
squares_dict = {i: i ** 2 for i in range(1, 6)}
print(squares_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
在 Python 中,字典(dict)是一種非常常用的數據結構,用于存儲鍵值對。當嘗試訪問一個不存在的鍵時,直接使用 dict[key] 會導致 KeyError。為了避免這種情況,可以使用以下幾種方法:
- 使用 get() 方法
get() 方法是字典的一個內置方法,它允許你安全地訪問字典中的值。如果鍵不存在,get() 方法會返回一個默認值(通常是 None),而不是拋出錯誤。
my_dict = {"a": 1, "b": 2}# 使用 get() 方法訪問鍵
value = my_dict.get("a") # 返回 1
print(value)# 如果鍵不存在,返回默認值 None
value = my_dict.get("c") # 返回 None
print(value)# 也可以指定默認值
value = my_dict.get("c", "默認值") # 返回 "默認值"
print(value)
- 使用 defaultdict
defaultdict 是 collections 模塊中的一個類,它繼承自普通的字典,但允許你指定一個默認值。當你訪問一個不存在的鍵時,defaultdict 會自動創建一個默認值,并將其與該鍵關聯起來。
from collections import defaultdict# 創建一個 defaultdict,指定默認值為 list
anagram_dict = defaultdict(list)# 添加一些數據
anagram_dict["a"].append("apple")
anagram_dict["b"].append("banana")# 訪問一個不存在的鍵
print(anagram_dict["c"]) # 輸出:[]
- 使用 setdefault() 方法
setdefault() 方法也是字典的一個內置方法,它類似于 get(),但會在鍵不存在時插入一個默認值。
my_dict = {"a": 1, "b": 2}# 使用 setdefault() 方法訪問鍵
value = my_dict.setdefault("a", "默認值") # 返回 1
print(value)# 如果鍵不存在,插入默認值
value = my_dict.setdefault("c", "默認值") # 返回 "默認值"
print(value)print(my_dict) # 輸出:{'a': 1, 'b': 2, 'c': '默認值'}
4. 集合(Set)??
集合(set)是一種無序且唯一的數據結構,它不允許有重復的元素,常用于去重、成員檢測和集合運算(如并集、交集、差集等)。
# 1、創建集合
str = set() # set() 是創建空集合的唯一方式,str = {}是空字典
my_set = {1, 2, 2, 3} # 自動去重 → {1, 2, 3}
from_list = set([3, 4, 5])
fruits = {'apple', 'banana', 'cherry'}# 2、訪問集合元素
# 由于集合是無序的,不能通過索引來訪問元素。但可以使用 for 循環遍歷集合中的元素,或者使用 in 關鍵字檢查元素是否存在于集合中```python
fruits = {'apple', 'banana', 'cherry'} # 遍歷集合
for fruit in fruits:print(fruit)# 檢查元素是否存在
is_apple_in = 'apple' in fruits
print(is_apple_in) # True# 3、添加元素
# 可以使用 add() 方法向集合中添加單個元素,使用 update() 方法添加多個元素(可以是列表、元組、集合等可迭代對象)
fruits = {'apple', 'banana'}
# 添加單個元素
fruits.add('cherry')
# 添加多個元素
fruits.update(['date', 'elderberry'])
print(fruits) # {'apple', 'banana', 'cherry', 'elderberry', 'date'}# 4、刪除元素
# 可以使用 remove()、discard() 和 pop() 方法來刪除集合中的元素
# remove():如果元素存在,將其從集合中移除;若元素不存在,會引發 KeyError
# discard():如果元素存在,將其從集合中移除;若元素不存在,不會引發錯誤
# pop():隨機移除并返回集合中的一個元素,若集合為空,會引發 KeyError
fruits = {'apple', 'banana', 'cherry'}# 使用 remove() 方法刪除元素
fruits.remove('apple')# 使用 discard() 方法刪除元素
fruits.discard('banana')# 使用 pop() 方法刪除元素
popped_fruit = fruits.pop()# 5、集合的常用操作
## 5.1并集:可以使用 | 運算符或 union() 方法實現
set1 = {1, 2, 3}
set2 = {3, 4, 5}# 使用 | 運算符求并集
union_set1 = set1 | set2# 使用 union() 方法求并集
union_set2 = set1.union(set2)print(union_set1) # {1, 2, 3, 4, 5}
print(union_set2) # {1, 2, 3, 4, 5}## 5.2交集:可以使用 & 運算符或 intersection() 方法實現
set1 = {1, 2, 3}
set2 = {3, 4, 5}# 使用 & 運算符求交集
intersection_set1 = set1 & set2# 使用 intersection() 方法求交集
intersection_set2 = set1.intersection(set2)print(intersection_set1) # {3}
print(intersection_set2) # {3}## 5.3差集:可以使用 - 運算符或 difference() 方法實現
set1 = {1, 2, 3}
set2 = {3, 4, 5}# 使用 - 運算符求差集
difference_set1 = set1 - set2# 使用 difference() 方法求差集
difference_set2 = set1.difference(set2)print(difference_set1) # {1, 2}
print(difference_set2) # {1, 2}## 5.4對稱差集:可以使用 ^ 運算符或 symmetric_difference() 方法實現
set1 = {1, 2, 3}
set2 = {3, 4, 5}# 使用 ^ 運算符求對稱差集
symmetric_difference_set1 = set1 ^ set2# 使用 symmetric_difference() 方法求對稱差集
symmetric_difference_set2 = set1.symmetric_difference(set2)print(symmetric_difference_set1) # {1, 2, 4, 5}
print(symmetric_difference_set2) # {1, 2, 4, 5}# 6、集合的長度
# 可以使用 len() 函數獲取集合中元素的數量
fruits = {'apple', 'banana', 'cherry'}
length = len(fruits)
print(length) # 3# 7、清空集合
# 可以使用 clear() 方法清空集合中的所有元素
fruits = {'apple', 'banana', 'cherry'}
fruits.clear()
print(fruits) # set()
5. 字符串(Str)
字符串是??不可變??的字符序列,支持文本處理和格式化。
# 創建字符串
s = "Hello, 世界!"
multiline = """多行
字符串""" # 切片與操作
print(s[0:5]) # 輸出: Hello
print(s.upper()) # 轉為大寫 # 常用方法
words = s.split(",") # 分割 → ['Hello', ' 世界!']
joined = '-'.join(words) # 合并 → "Hello-世界!" # 格式化
name = "Alice"
print(f"Name: {name}") # 輸出: Name: Alice
6. 隊列(Queue)與棧(Stack)?
??隊列(FIFO)??:用 deque 實現。
??棧(LIFO)??:用列表的 append 和 pop 實現。
隊列(Queue)和棧(Stack)是兩種常見的數據結構,它們在數據存儲和訪問方式上有很大的區別。以下是它們的主要區別:
6.1. 數據訪問方式
6.1.1 隊列(Queue)
特點:先進先出(FIFO,First In First Out)。最早進入隊列的元素會最先被移除。
操作:
入隊(Enqueue):在隊列的尾部添加一個元素。
出隊(Dequeue):從隊列的頭部移除一個元素。
查看隊首元素(Peek):查看隊列頭部的元素,但不移除它。
6.1.2 棧(Stack)
特點:后進先出(LIFO,Last In First Out)。最后進入棧的元素會最先被移除。
操作:
入棧(Push):在棧的頂部添加一個元素。
出棧(Pop):從棧的頂部移除一個元素。
查看棧頂元素(Peek):查看棧頂的元素,但不移除它。
# 隊列示例
from collections import deque
queue = deque([1, 2, 3])
queue.append(4) # 入隊
print(queue.popleft()) # 出隊 → 1 # 棧示例
stack = []
stack.append(10) # 入棧
print(stack.pop()) # 出棧 → 10
6.2. 應用場景
隊列(Queue)
任務調度:操作系統中的任務調度,按照任務到達的順序執行。
消息隊列:在多線程或多進程環境中,用于傳遞消息。
打印隊列:打印機按照任務提交的順序打印文檔。
廣度優先搜索(BFS):在圖的遍歷中,隊列用于存儲待訪問的節點。
棧(Stack)
函數調用:程序運行時,函數調用的上下文(如局部變量、返回地址等)存儲在棧中。
表達式求值:計算算術表達式的值,如逆波蘭表達式。
括號匹配:檢查括號是否正確匹配。
深度優先搜索(DFS):在圖的遍歷中,棧用于存儲待訪問的節點。
撤銷操作(Undo):在軟件中實現撤銷功能,如文本編輯器中的撤銷操作。
6.3. 實現方式
隊列(Queue)
Python 實現:可以使用 collections.deque,它是一個雙端隊列,支持高效的頭部和尾部操作。
from collections import dequequeue = deque()
queue.append(1) # 入隊
queue.append(2)
queue.append(3)
print(queue.popleft()) # 出隊,輸出 1
棧(Stack)
Python 實現:可以使用普通的列表(list),利用 append() 和 pop() 方法來模擬棧的操作。
stack = []
stack.append(1) # 入棧
stack.append(2)
stack.append(3)
print(stack.pop()) # 出棧,輸出 3
6.4. 內存結構
隊列(Queue)
隊列的元素順序是固定的,新元素總是添加到尾部,舊元素總是從頭部移除。隊列的頭部和尾部可以動態變化。
隊列通常需要維護兩個指針(頭部指針和尾部指針)來跟蹤元素的位置。
棧(Stack)
棧的元素順序是動態的,新元素總是添加到頂部,舊元素也總是從頂部移除。棧的頂部位置會不斷變化。
棧通常只需要維護**一個指針(棧頂指針)**來跟蹤元素的位置。
6.5. 性能
隊列(Queue)
使用 collections.deque 時,隊列的頭部和尾部操作(入隊、出隊)的時間復雜度為 O(1)。
棧(Stack)
使用列表(list)時,棧的入棧和出棧操作的時間復雜度為 O(1)。