Python中內(nèi)置的數(shù)據(jù)結(jié)構(gòu)類型詳解(內(nèi)置數(shù)據(jù)容器)
1. 元組(Tuple)??
元組是一種??不可變??的有序序列,用于存儲(chǔ)固定數(shù)據(jù)。適用于需要數(shù)據(jù)保護(hù)或哈希的場(chǎng)景(如字典的鍵)。
# 1、創(chuàng)建元組 # 可以使用圓括號(hào) () 或者內(nèi)置的 tuple() 函數(shù)來(lái)創(chuàng)建元組 empty_tuple = () # 空元組 single_element = (1,) # 單元素元組(需逗號(hào)) multi_elements = (1, "a", 3.14) # 使用 tuple() 函數(shù)創(chuàng)建元組 from_list = tuple([4, 5, 6]) # 從列表創(chuàng)建元組 from_string = tuple('abc') # 從字符串創(chuàng)建元組 ,輸出('a', 'b', 'c') # 2、雙向訪問(wèn)與切片 # 元組支持切片操作,用于獲取元組的子集 # 切片操作使用 [start:stop:step] 的語(yǔ)法 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"錯(cuò)誤: {e}") # 輸出: 元組不可修改 # 4、常用方法 # 元組只有兩個(gè)內(nèi)置方法:count() 和 index() # count():用于返回指定元素在元組中出現(xiàn)的次數(shù) # index():用于返回指定元素在元組中第一次出現(xiàn)的索引,如果元素不存在則引發(fā) ValueError count = multi_elements.count(1) # 統(tǒng)計(jì)元素在元組中出現(xiàn)次數(shù) index = multi_elements.index("a") # 查找元素索引 print(count, index) # 輸出: 1 1 # 5、元組的解包 # 可以將元組中的元素解包到多個(gè)變量中 my_tuple = (10, 20, 30) a, b, c = my_tuple print(a) # 輸出10 print(b) # 輸出20 print(c) # 輸出30 # 6、元組作為函數(shù)返回值 # 函數(shù)可以返回一個(gè)元組,方便同時(shí)返回多個(gè)值 def get_name_and_age(): return 'Alice', 25 name, 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)?
列表是??可變??的有序集合,支持動(dòng)態(tài)增刪改,適合存儲(chǔ)動(dòng)態(tài)數(shù)據(jù)。與元組不同,列表的元素可以被修改、添加或刪除。
# 1、創(chuàng)建列表 my_list = [1, "a", 3.14] from_range = list(range(3)) # [0, 1, 2] # 2、訪問(wèn)與切片 my_list = [10, 20, 30, 40, 50] first_element = my_list[0] # 訪問(wèn)第一個(gè)元素 last_element = my_list[-1] #訪問(wèn)最后一個(gè)元素 subset = my_list[1:3] # 獲取從索引 1 到索引 3(不包含)的元素 every_second = my_list[0::2] # 獲取從索引 0 到末尾,步長(zhǎng)為 2 的元素 # 3、增刪改操作 # 可以使用 append()、extend() 和 insert() 方法來(lái)添加元素 # 可以使用 remove()、pop() 和 del 語(yǔ)句來(lái)刪除元素 my_list = [10, 10, 20, 30, 40, 50] my_list.append(4) # 末尾添加 my_list.extend([5, 6]) # 擴(kuò)展列表,將另一個(gè)可迭代對(duì)象的元素添加到列表末尾 my_list.insert(1, 15) # 在指定索引位置插入一個(gè)元素 my_list[1] = 20 # 修改元素 my_list.remove(20) # 刪除指定值的第一個(gè)匹配項(xiàng) 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) # 統(tǒng)計(jì)元素 2 出現(xiàn)的次數(shù) index_3 = my_list.index(3) # 查找元素 3 第一次出現(xiàn)的索引 my_list.sort() # 對(duì)列表進(jìn)行排序 my_list.reverse() # 反轉(zhuǎn)列表 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、列表推導(dǎo)式 # 創(chuàng)建一個(gè)包含 1 到 5 的平方的列表 # 列表推導(dǎo)式是一種簡(jiǎn)潔的創(chuàng)建列表的方式 squares = [i ** 2 for i in range(1, 6)] print(squares) # [1, 4, 9, 16, 25]
3. 字典(Dict)
字典(dict)是一種無(wú)序、可變且以鍵值對(duì)形式存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。字典是??鍵值對(duì)??的無(wú)序集合(Python 3.7+ 有序),支持快速查詢。
# 1、創(chuàng)建字典 # 可以使用花括號(hào) {} 或者內(nèi)置的 dict() 函數(shù)來(lái)創(chuàng)建字典 empty_dict = {} # 空字典 simple_dict = {'name': 'Alice', 'age': 25} # 包含鍵值對(duì)的字典 from_tuples = dict([('city', 'New York'), ('country', 'USA')]) from_kwargs = dict(name='Bob', age=30) # 2、訪問(wèn)字典元素 # 可以通過(guò)鍵來(lái)訪問(wèn)字典中的值。如果鍵不存在,直接訪問(wèn)會(huì)引發(fā) KeyError # 解決辦法在下段落,此處先不談 my_dict = {'name': 'Alice', 'age': 25} name = my_dict['name'] # 通過(guò)鍵訪問(wèn)值 city = my_dict.get('city') # 使用 get() 方法訪問(wèn)值,如果鍵不存在,返回默認(rèn)值(這里是 None) # 3、增刪查改 my_dict = {'name': 'Alice', 'age': 25} my_dict['age'] = 26 # 修改已有鍵的值 my_dict['city'] = 'New York' # 添加新的鍵值對(duì) print(my_dict) # {'name': 'Alice', 'age': 26, 'city': 'New York'} del my_dict['city'] # 使用 del 語(yǔ)句刪除指定鍵的鍵值對(duì) age = my_dict.pop('age') # 使用 pop() 方法刪除指定鍵的鍵值對(duì),并返回該鍵對(duì)應(yīng)的值 print(my_dict) # {'name': 'Alice'} # 4、遍歷鍵值 for key, value in person.items(): print(f"{key}: {value}") # 5、常用方法 # keys():返回一個(gè)包含字典所有鍵的視圖對(duì)象。 # values():返回一個(gè)包含字典所有值的視圖對(duì)象。 # items():返回一個(gè)包含字典所有鍵值對(duì)的視圖對(duì)象。 # update():將另一個(gè)字典的鍵值對(duì)更新到當(dāng)前字典中 my_dict = {'name': 'Alice', 'age': 25} keys = my_dict.keys() # 獲取所有鍵 values = my_dict.values() # 獲取所有值 items = my_dict.items() # 獲取所有鍵值對(duì) 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、字典推導(dǎo)式 # 創(chuàng)建一個(gè)包含 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)是一種非常常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)鍵值對(duì)。當(dāng)嘗試訪問(wèn)一個(gè)不存在的鍵時(shí),直接使用 dict[key] 會(huì)導(dǎo)致 KeyError。為了避免這種情況,可以使用以下幾種方法:
使用 get() 方法
get() 方法是字典的一個(gè)內(nèi)置方法,它允許你安全地訪問(wèn)字典中的值。如果鍵不存在,get() 方法會(huì)返回一個(gè)默認(rèn)值(通常是 None),而不是拋出錯(cuò)誤。
my_dict = {"a": 1, "b": 2} # 使用 get() 方法訪問(wèn)鍵 value = my_dict.get("a") # 返回 1 print(value) # 如果鍵不存在,返回默認(rèn)值 None value = my_dict.get("c") # 返回 None print(value) # 也可以指定默認(rèn)值 value = my_dict.get("c", "默認(rèn)值") # 返回 "默認(rèn)值" print(value)
使用 defaultdict
defaultdict 是 collections 模塊中的一個(gè)類,它繼承自普通的字典,但允許你指定一個(gè)默認(rèn)值。當(dāng)你訪問(wèn)一個(gè)不存在的鍵時(shí),defaultdict 會(huì)自動(dòng)創(chuàng)建一個(gè)默認(rèn)值,并將其與該鍵關(guān)聯(lián)起來(lái)。
my_dict = {"a": 1, "b": 2} # 使用 get() 方法訪問(wèn)鍵 value = my_dict.get("a") # 返回 1 print(value) # 如果鍵不存在,返回默認(rèn)值 None value = my_dict.get("c") # 返回 None print(value) # 也可以指定默認(rèn)值 value = my_dict.get("c", "默認(rèn)值") # 返回 "默認(rèn)值" print(value)
使用 setdefault() 方法
setdefault() 方法也是字典的一個(gè)內(nèi)置方法,它類似于 get(),但會(huì)在鍵不存在時(shí)插入一個(gè)默認(rèn)值。
my_dict = {"a": 1, "b": 2} # 使用 setdefault() 方法訪問(wèn)鍵 value = my_dict.setdefault("a", "默認(rèn)值") # 返回 1 print(value) # 如果鍵不存在,插入默認(rèn)值 value = my_dict.setdefault("c", "默認(rèn)值") # 返回 "默認(rèn)值" print(value) print(my_dict) # 輸出:{'a': 1, 'b': 2, 'c': '默認(rèn)值'}
4. 集合(Set)??
集合(set)是一種無(wú)序且唯一的數(shù)據(jù)結(jié)構(gòu),它不允許有重復(fù)的元素,常用于去重、成員檢測(cè)和集合運(yùn)算(如并集、交集、差集等)。
# 1、創(chuàng)建集合 str = set() # set() 是創(chuàng)建空集合的唯一方式,str = {}是空字典 my_set = {1, 2, 2, 3} # 自動(dòng)去重 → {1, 2, 3} from_list = set([3, 4, 5]) fruits = {'apple', 'banana', 'cherry'} # 2、訪問(wèn)集合元素 # 由于集合是無(wú)序的,不能通過(guò)索引來(lái)訪問(wèn)元素。但可以使用 for 循環(huán)遍歷集合中的元素,或者使用 in 關(guān)鍵字檢查元素是否存在于集合中 ```python fruits = {'apple', 'banana', 'cherry'} # 遍歷集合 for fruit in fruits: print(fruit) # 檢查元素是否存在 is_apple_in = 'apple' in fruits print(is_apple_in) # True # 3、添加元素 # 可以使用 add() 方法向集合中添加單個(gè)元素,使用 update() 方法添加多個(gè)元素(可以是列表、元組、集合等可迭代對(duì)象) fruits = {'apple', 'banana'} # 添加單個(gè)元素 fruits.add('cherry') # 添加多個(gè)元素 fruits.update(['date', 'elderberry']) print(fruits) # {'apple', 'banana', 'cherry', 'elderberry', 'date'} # 4、刪除元素 # 可以使用 remove()、discard() 和 pop() 方法來(lái)刪除集合中的元素 # remove():如果元素存在,將其從集合中移除;若元素不存在,會(huì)引發(fā) KeyError # discard():如果元素存在,將其從集合中移除;若元素不存在,不會(huì)引發(fā)錯(cuò)誤 # pop():隨機(jī)移除并返回集合中的一個(gè)元素,若集合為空,會(huì)引發(fā) KeyError fruits = {'apple', 'banana', 'cherry'} # 使用 remove() 方法刪除元素 fruits.remove('apple') # 使用 discard() 方法刪除元素 fruits.discard('banana') # 使用 pop() 方法刪除元素 popped_fruit = fruits.pop() # 5、集合的常用操作 ## 5.1并集:可以使用 | 運(yùn)算符或 union() 方法實(shí)現(xiàn) set1 = {1, 2, 3} set2 = {3, 4, 5} # 使用 | 運(yùn)算符求并集 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交集:可以使用 & 運(yùn)算符或 intersection() 方法實(shí)現(xiàn) set1 = {1, 2, 3} set2 = {3, 4, 5} # 使用 & 運(yùn)算符求交集 intersection_set1 = set1 & set2 # 使用 intersection() 方法求交集 intersection_set2 = set1.intersection(set2) print(intersection_set1) # {3} print(intersection_set2) # {3} ## 5.3差集:可以使用 - 運(yùn)算符或 difference() 方法實(shí)現(xiàn) set1 = {1, 2, 3} set2 = {3, 4, 5} # 使用 - 運(yùn)算符求差集 difference_set1 = set1 - set2 # 使用 difference() 方法求差集 difference_set2 = set1.difference(set2) print(difference_set1) # {1, 2} print(difference_set2) # {1, 2} ## 5.4對(duì)稱差集:可以使用 ^ 運(yùn)算符或 symmetric_difference() 方法實(shí)現(xiàn) set1 = {1, 2, 3} set2 = {3, 4, 5} # 使用 ^ 運(yùn)算符求對(duì)稱差集 symmetric_difference_set1 = set1 ^ set2 # 使用 symmetric_difference() 方法求對(duì)稱差集 symmetric_difference_set2 = set1.symmetric_difference(set2) print(symmetric_difference_set1) # {1, 2, 4, 5} print(symmetric_difference_set2) # {1, 2, 4, 5} # 6、集合的長(zhǎng)度 # 可以使用 len() 函數(shù)獲取集合中元素的數(shù)量 fruits = {'apple', 'banana', 'cherry'} length = len(fruits) print(length) # 3 # 7、清空集合 # 可以使用 clear() 方法清空集合中的所有元素 fruits = {'apple', 'banana', 'cherry'} fruits.clear() print(fruits) # set()
5. 字符串(Str)
字符串是??不可變??的字符序列,支持文本處理和格式化。
# 創(chuàng)建字符串 s = "Hello, 世界!" multiline = """多行 字符串""" # 切片與操作 print(s[0:5]) # 輸出: Hello print(s.upper()) # 轉(zhuǎn)為大寫 # 常用方法 words = s.split(",") # 分割 → ['Hello', ' 世界!'] joined = '-'.join(words) # 合并 → "Hello-世界!" # 格式化 name = "Alice" print(f"Name: {name}") # 輸出: Name: Alice
6. 隊(duì)列(Queue)與棧(Stack)?
??隊(duì)列(FIFO)??:用 deque 實(shí)現(xiàn)。
??棧(LIFO)??:用列表的 append 和 pop 實(shí)現(xiàn)。
隊(duì)列(Queue)和棧(Stack)是兩種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),它們?cè)跀?shù)據(jù)存儲(chǔ)和訪問(wèn)方式上有很大的區(qū)別。以下是它們的主要區(qū)別:
6.1. 數(shù)據(jù)訪問(wèn)方式
6.1.1 隊(duì)列(Queue)
特點(diǎn):先進(jìn)先出(FIFO,F(xiàn)irst In First Out)。最早進(jìn)入隊(duì)列的元素會(huì)最先被移除。
操作:
入隊(duì)(Enqueue):在隊(duì)列的尾部添加一個(gè)元素。
出隊(duì)(Dequeue):從隊(duì)列的頭部移除一個(gè)元素。
查看隊(duì)首元素(Peek):查看隊(duì)列頭部的元素,但不移除它。
6.1.2 棧(Stack)
特點(diǎn):后進(jìn)先出(LIFO,Last In First Out)。最后進(jìn)入棧的元素會(huì)最先被移除。
操作:
入棧(Push):在棧的頂部添加一個(gè)元素。
出棧(Pop):從棧的頂部移除一個(gè)元素。
查看棧頂元素(Peek):查看棧頂?shù)脑?,但不移除它?/p>
# 隊(duì)列示例 from collections import deque queue = deque([1, 2, 3]) queue.append(4) # 入隊(duì) print(queue.popleft()) # 出隊(duì) → 1 # 棧示例 stack = [] stack.append(10) # 入棧 print(stack.pop()) # 出棧 → 10
6.2. 應(yīng)用場(chǎng)景
隊(duì)列(Queue)
任務(wù)調(diào)度:操作系統(tǒng)中的任務(wù)調(diào)度,按照任務(wù)到達(dá)的順序執(zhí)行。
消息隊(duì)列:在多線程或多進(jìn)程環(huán)境中,用于傳遞消息。
打印隊(duì)列:打印機(jī)按照任務(wù)提交的順序打印文檔。
廣度優(yōu)先搜索(BFS):在圖的遍歷中,隊(duì)列用于存儲(chǔ)待訪問(wèn)的節(jié)點(diǎn)。
棧(Stack)
函數(shù)調(diào)用:程序運(yùn)行時(shí),函數(shù)調(diào)用的上下文(如局部變量、返回地址等)存儲(chǔ)在棧中。
表達(dá)式求值:計(jì)算算術(shù)表達(dá)式的值,如逆波蘭表達(dá)式。
括號(hào)匹配:檢查括號(hào)是否正確匹配。
深度優(yōu)先搜索(DFS):在圖的遍歷中,棧用于存儲(chǔ)待訪問(wèn)的節(jié)點(diǎn)。
撤銷操作(Undo):在軟件中實(shí)現(xiàn)撤銷功能,如文本編輯器中的撤銷操作。
6.3. 實(shí)現(xiàn)方式
隊(duì)列(Queue)
Python 實(shí)現(xiàn):可以使用 collections.deque,它是一個(gè)雙端隊(duì)列,支持高效的頭部和尾部操作。
from collections import deque queue = deque() queue.append(1) # 入隊(duì) queue.append(2) queue.append(3) print(queue.popleft()) # 出隊(duì),輸出 1
棧(Stack)
Python 實(shí)現(xiàn):可以使用普通的列表(list),利用 append() 和 pop() 方法來(lái)模擬棧的操作。
stack = [] stack.append(1) # 入棧 stack.append(2) stack.append(3) print(stack.pop()) # 出棧,輸出 3
6.4. 內(nèi)存結(jié)構(gòu)
隊(duì)列(Queue)
隊(duì)列的元素順序是固定的,新元素總是添加到尾部,舊元素總是從頭部移除。隊(duì)列的頭部和尾部可以動(dòng)態(tài)變化。
隊(duì)列通常需要維護(hù)兩個(gè)指針(頭部指針和尾部指針)來(lái)跟蹤元素的位置。
棧(Stack)
棧的元素順序是動(dòng)態(tài)的,新元素總是添加到頂部,舊元素也總是從頂部移除。棧的頂部位置會(huì)不斷變化。
棧通常只需要維護(hù)**一個(gè)指針(棧頂指針)**來(lái)跟蹤元素的位置。
6.5. 性能
隊(duì)列(Queue)
使用 collections.deque 時(shí),隊(duì)列的頭部和尾部操作(入隊(duì)、出隊(duì))的時(shí)間復(fù)雜度為 O(1)。
棧(Stack)
使用列表(list)時(shí),棧的入棧和出棧操作的時(shí)間復(fù)雜度為 O(1)。
總結(jié):數(shù)據(jù)結(jié)構(gòu)對(duì)比表
- Python 中的Schema數(shù)據(jù)結(jié)構(gòu)及類型校驗(yàn)詳解
- Python基礎(chǔ)知識(shí)+結(jié)構(gòu)+數(shù)據(jù)類型
- python數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)類型
- Python基本數(shù)據(jù)結(jié)構(gòu)之字典類型dict用法分析
- Python學(xué)習(xí)筆記基本數(shù)據(jù)結(jié)構(gòu)之序列類型list tuple range用法分析
- 使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)
- Python入門_淺談數(shù)據(jù)結(jié)構(gòu)的4種基本類型
相關(guān)文章
python版本坑:md5例子(python2與python3中md5區(qū)別)
這篇文章主要介紹了python版本坑:md5例子(python2與python3中md5區(qū)別),需要的朋友可以參考下2017-06-06Python基礎(chǔ)之循環(huán)語(yǔ)句相關(guān)知識(shí)總結(jié)
今天給大家?guī)?lái)的是關(guān)于Python基礎(chǔ)的相關(guān)知識(shí),文章圍繞著Python循環(huán)語(yǔ)句展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06火遍網(wǎng)絡(luò)的python中秋節(jié)賀卡現(xiàn)在學(xué)還趕得上
中秋將至,我用python編寫了個(gè)火遍網(wǎng)絡(luò)的中秋節(jié)賀卡,現(xiàn)在學(xué)起來(lái)還不晚,文中給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09教你怎么用Python實(shí)現(xiàn)GIF動(dòng)圖的提取及合成
今天教大家一個(gè)Python有趣好玩的小功能:將多張圖片轉(zhuǎn)為GIF,同時(shí)也可以將一個(gè)GIF動(dòng)圖提取出里面的圖片,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Python使用Socket實(shí)現(xiàn)簡(jiǎn)單聊天程序
這篇文章主要介紹了Python使用Socket實(shí)現(xiàn)簡(jiǎn)單聊天程序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02python實(shí)現(xiàn)修改固定模式的字符串內(nèi)容操作示例
這篇文章主要介紹了python實(shí)現(xiàn)修改固定模式的字符串內(nèi)容操作,結(jié)合實(shí)例形式詳細(xì)分析了Python修改固定模式字符串原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-12-12python自動(dòng)定時(shí)任務(wù)schedule庫(kù)的使用方法
當(dāng)你需要在 Python 中定期執(zhí)行任務(wù)時(shí),schedule 庫(kù)是一個(gè)非常實(shí)用的工具,它可以幫助你自動(dòng)化定時(shí)任務(wù),本文給大家介紹了python自動(dòng)定時(shí)任務(wù)schedule庫(kù)的使用方法,需要的朋友可以參考下2024-02-02