Python 中的數據結構——完整指南
已發表: 2021-06-14目錄
什麼是數據結構?
數據結構是指數據的計算存儲以便有效使用。 它以易於修改和訪問的方式存儲數據。 它統指數據的值、它們之間的關係以及可以對數據進行的操作。 數據結構的重要性在於它在開發計算機程序中的應用。 由於計算機程序嚴重依賴數據,因此為方便訪問而正確安排數據對於任何程序或軟件來說都是最重要的。
數據結構的四個主要功能是
- 輸入信息
- 處理信息
- 維護信息
- 檢索信息
Python中的數據結構類型
Python 支持多種數據結構,以便於訪問和存儲數據。 Python 數據結構類型可以分為原始數據類型和非原始數據類型。 前一種數據類型包括整數、浮點數、字符串和布爾值,而後一種數據類型是數組、列表、元組、字典、集合和文件。 因此, python中的數據結構既是內置的數據結構,也是用戶自定義的數據結構。 內置數據結構稱為非原始數據結構。
內置數據結構
Python 有幾種數據結構,它們充當存儲其他數據的容器。 這些Python 數據結構是 List、Dictionaries、Tuple 和 Sets。
用戶定義的數據結構
這些數據結構可以編程為與python中內置數據結構相同的功能。 用戶定義的數據結構有:Linked List、Stack、Queue、Tree、Graph 和 Hashmap。
內置數據結構列表和解釋
1. 列表
存儲在列表中的數據是按順序排列的,具有不同的數據類型。 對於每個數據,都會分配一個地址,它被稱為索引。 索引值從 0 開始,一直持續到最後一個元素。 這稱為正指數。 如果元素被反向訪問,也存在負索引。 這稱為負索引。
列表創建
該列表創建為方括號。 然後可以相應地添加元素。 可以將其添加到方括號中以創建列表。 如果沒有添加任何元素,則會創建一個空列表。 否則將創建列表中的元素。
輸入 my_list = [] #創建空列表 打印(我的列表) my_list = [1, 2, 3, 'example', 3.132] #用數據創建列表 打印(我的列表) | 輸出 [] [1, 2, 3, '例子', 3.132] |
在列表中添加元素
三個函數用於在列表中添加元素。 這些函數是 append()、extend() 和 insert()。
- 使用 append() 函數將所有元素添加為單個元素。
- 為了在列表中一個一個地添加元素,使用了 extend() 函數。
- 為了通過索引值添加元素,使用 insert() 函數。
輸入 my_list = [1, 2, 3] 打印(我的列表) my_list.append([555, 12]) #添加為單個元素 打印(我的列表) my_list.extend([234, 'more_example']) #添加為不同的元素 打印(我的列表) my_list.insert(1, 'insert_example') #添加元素 i 打印(我的列表) | 輸出: [1、2、3] [1, 2, 3, [555, 12]] [1, 2, 3, [555, 12], 234, 'more_example'] [1, 'insert_example', 2, 3, [555, 12], 234, 'more_example'] |
刪除列表中的元素
python中的內置關鍵字“del”用於從列表中刪除元素。 但是,此函數不會返回已刪除的元素。
- 要返回已刪除的元素,使用 pop() 函數。 它使用要刪除的元素的索引值。
- remove() 函數用於按元素的值刪除元素。
輸出:
[1, 2, 3, '例子', 3.132, 30]
[1、2、3、3.132、30]
彈出元素:2 剩餘列表:[1, 3, 3.132, 30]
[]
評估列表中的元素
- 評估列表中的元素很簡單。 打印列表將直接顯示元素。
- 可以通過傳遞索引值來評估特定元素。
輸出:
1
2
3
例子
3.132
10
30
[1, 2, 3, '例子', 3.132, 10, 30]
例子
[1, 2]
[30, 10, 3.132, '例子', 3, 2, 1]
除了上述操作之外,python 中還提供了其他幾個用於處理列表的內置函數。
- len():該函數用於返回列表的長度。
- index():此函數允許用戶知道傳遞的值的索引值。
- count() 函數用於查找傳遞給它的值的計數。
- sort() 對列表中的值進行排序並修改列表。
- sorted() 對列表中的值進行排序並返回列表。
輸出
6
3
2
[1、2、3、10、10、30]
[30、10、10、3、2、1]
2.字典
字典是一種存儲鍵值對而不是單個元素的數據結構。 可以用一個電話簿的例子來解釋它,其中包含所有個人號碼及其電話號碼。 這裡的姓名和電話號碼定義了作為“鍵”的常量值,以及所有個人的號碼和姓名作為該鍵的值。 評估一個鍵將允許訪問存儲在該鍵中的所有值。 這種在 Python 上定義的鍵值結構被稱為字典。
字典的創建
- 花括號閒置的dict()函數可用於創建字典。
- 創建字典時要添加鍵值對。
鍵值對中的修改
字典中的任何修改都只能通過鍵來完成。 因此,應首先訪問密鑰,然後進行修改。
輸入 my_dict = {'First': 'Python', 'Second': 'Java'} print(my_dict) my_dict['Second'] = 'C++' #更改元素 print(my_dict) my_dict['Third'] = 'Ruby' #添加鍵值對打印(my_dict) | 輸出: {'第一':'Python','第二':'Java'} {'第一':'Python','第二':'C++'} {'First':'Python','Second':'C++','Third':'Ruby'} |
刪除字典
clear() 函數用於刪除整個字典。 可以使用 get() 函數或傳遞鍵值通過鍵來評估字典。
輸入 dict = {'月份':'一月','季節':'冬天'} 打印(字典['第一']) 打印(dict.get('第二') | 輸出 一月 冬天 |
與字典相關的其他函數是keys()、values() 和items()。
3. 元組
與列表類似,元組是數據存儲列表,但唯一的區別是元組中存儲的數據不能被修改。 如果元組中的數據是可變的,那麼只有這樣才能更改數據。
- 元組可以通過 tuple() 函數創建。
輸入
新元組 = (10, 20, 30, 40)
打印(新元組)
輸出
(10, 20, 30, 40)
- 可以以與評估列表中的元素相同的方式評估元組中的元素。
輸入
new_tuple2 = (10, 20, 30, '年齡')
對於 new_tuple2 中的 x:
打印(x)
打印(新元組2)
打印(new_tuple2[0])
輸出
10
20
30
年齡
(10, 20, 30, '年齡')
10
- '+' 運算符用於附加另一個元組
輸入
元組 = (1, 2, 3)
元組 = 元組 + (4, 5, 6
打印(元組)
輸出
(1, 2, 3, 4, 5, 6)
4.設置
集合數據結構類似於算術集合。 它基本上是獨特元素的集合。 如果數據不斷重複,則集合只考慮添加該元素一次。
- 只需在花括號中將值傳遞給它,就可以創建一個集合。
輸入
設置 = {10, 20, 30, 40, 40, 40}
打印(設置)
輸出
{10、20、30、40}
- add() 函數可用於將元素添加到集合中。
- 要合併來自兩個集合的數據,可以使用 union() 函數。
- 為了識別這兩個集合中存在的數據,使用了intersection() 函數。
- difference() 函數只輸出集合中唯一的數據,去除公共數據。
- symmetric_difference() 函數輸出兩組唯一的數據。
用戶自定義數據結構列表及說明
1. 堆棧
堆棧是一種線性結構,可以是後進先出 (LIFO) 或先進後出 (FIFO) 結構。 堆棧中存在兩個主要操作,即 push 和 pop。 Push 意味著在列表頂部添加一個元素,而 pop 意味著從堆棧底部刪除一個元素。 圖 1很好地描述了該過程。
堆棧的用處
- 以前的元素可以通過回溯進行評估。
- 遞歸元素的匹配。
資源
圖 1:堆棧的圖形表示
例子
輸出
['第一第二第三']
['第一第二第三第四第五']
第五
['第一第二第三第四']
2.排隊
與堆棧類似,隊列是一種線性結構,允許在一端插入元素並從另一端刪除元素。 這兩個操作稱為入隊和出隊。 最近添加的元素像堆棧一樣首先被刪除。 隊列的圖形表示如圖 2所示。隊列的主要用途之一是在事物進入後立即對其進行處理。
資源
圖 2 :隊列的圖形表示
例子
輸出
['第一第二第三']
['第一第二第三第四第五']
第一的
第五
['第二','第三','第四','第五']
3. 樹
樹是由通過邊鏈接的節點組成的非線性和分層數據結構。 python樹數據結構有根節點、父節點和子節點。 根是數據結構的最頂層元素。 二叉樹是一種結構,其中元素的子節點不超過兩個。
樹的用處
- 顯示數據元素的結構關係。
- 高效遍歷每個節點
- 用戶可以插入、搜索、檢索和刪除數據。
- 靈活的數據結構
圖 3:樹的圖形表示
資源
例子:
輸出
第一的
第二
第三
4. 圖表
python中的另一種非線性數據結構是由節點和邊組成的圖。 它以圖形方式顯示一組對象,其中一些對象通過鏈接連接。 頂點是相互連接的對象,而鏈接稱為邊。 圖的表示可以通過python的字典數據結構來完成,其中鍵代表頂點,值代表邊。
可以對圖執行的基本操作
- 顯示圖形頂點和邊。
- 添加一個頂點。
- 添加邊緣。
- 創建圖表
圖表的用處
- 圖的表示很容易理解和遵循。
- 這是一個很好的結構來表示鏈接關係,即 Facebook 朋友。
圖 4:圖形的圖形表示
資源
例子
g = 圖(4)
g.edge(0, 2)
g.edge(1, 3)
g.edge(3, 2)
g.edge(0, 3)
g.__repr__()
輸出
頂點0的鄰接表
頭 -> 3 -> 2
頂點1的鄰接表
頭-> 3
頂點2的鄰接表
頭 -> 3 -> 0
頂點3的鄰接表
頭 -> 0 -> 2 -> 1
5.哈希圖
哈希圖是用於存儲鍵值對的索引python 數據結構。 存儲在散列圖中的數據是通過在散列函數的幫助下計算的鍵來檢索的。 這些類型的數據結構對於存儲學生數據、客戶詳細信息等很有用。python 中的字典是 hashmap 的一個示例。
例子
輸出
0 -> 第一個
1 -> 第二
2 -> 第三
0 -> 第一個
1 -> 第二
2 -> 第三
3 -> 第四
0 -> 第一個
1 -> 第二
2 -> 第三
用處
- 與其他數據結構相比,它是最靈活、最可靠的信息檢索方法。
6.鍊錶
它是一種線性數據結構。 基本上,它是通過 python 中的鏈接連接在一起的一系列數據元素。 鍊錶中的元素通過指針連接。 該數據結構的第一個節點稱為頭部,最後一個節點稱為尾部。 因此,鍊錶由具有值的節點組成,每個節點由鏈接到另一個節點的指針組成。
鍊錶的用處
- 與固定的數組相比,鍊錶是一種動態的數據輸入形式。 內存在分配節點內存時被保存。 在數組中,必須預先定義大小,這會導致內存浪費。
- 鍊錶可以存儲在內存中的任何位置。 鍊錶節點可以更新並移動到不同的位置。
圖 6:鍊錶的圖形表示
資源
例子
輸出:
['第一第二第三']
['第一','第二','第三','第六','第四','第五']
['第一','第三','第六','第四','第五']
結論
已經探索了python中的各種類型的數據結構。 無論是新手還是專家,數據結構和算法都不容忽視。 在對數據執行任何形式的操作時,數據結構的概念起著至關重要的作用。 數據結構有助於以有組織的方式存儲信息,而算法有助於指導整個數據分析。 因此, python 數據結構和算法都可以幫助計算機科學家或任何用戶處理他們的數據。
如果您想了解數據結構,請查看 IIIT-B 和 upGrad 的數據科學執行 PG 計劃,該計劃是為在職專業人士創建的,提供 10 多個案例研究和項目、實用的實踐研討會、與行業專家的指導、1與行業導師一對一,400 多個小時的學習和頂級公司的工作協助。
Python中哪種數據結構更快?
在字典中,查找速度更快,因為 Python 使用哈希表來實現它們。 如果我們使用大 O 概念來說明區別,字典具有恆定的時間複雜度 O(1),而列表具有線性時間複雜度 O(n)。
在 Python 中,字典是頻繁查找包含數千個條目的數據的最快方法。 字典經過高度優化,因為它們是 Python 中的內置映射類型。 然而,在字典和列表中,有一個常見的時空權衡。 這表明雖然我們可以減少我們的方法所需的時間,但我們將需要使用更多的內存空間。
在列表中,要獲得所需的內容,您必須查看完整列表。 另一方面,字典將返回您要查找的值,而無需查看所有鍵。
Python列表或數組中哪個更快?
一般來說,Python 列表非常靈活,可以保存完全異構的隨機數據,並且可以在近似恆定的時間內快速追加。 如果您需要快速、輕鬆地縮小和擴展列表,它們是您的最佳選擇。 然而,它們比數組佔用更多的空間,部分原因是列表中的每個項目都需要創建一個單獨的 Python 對象。
另一方面,array.array 類型本質上是 C 數組的薄包裝。 它只能攜帶同質數據(即相同類型的數據),因此內存限制為 sizeof(one object) * length 個字節。
NumPy 數組和列表有什麼區別?
Numpy 是 Python 的科學計算核心包。 它使用大型多維數組對像以及用於操作它們的實用程序。 numpy 數組是由非負整數元組索引的相同類型值的網格。
列表包含在 Python 核心庫中。 列表類似於 Python 中的數組,但它可以調整大小並包含各種類型的元素。 這裡真正的區別是什麼? 性能就是答案。 Numpy 數據結構在大小、性能和功能方面更有效。