一、相關
數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。
Python中的絕大部分數據結構可以最終分解成三種類型:集合(Set),序列(Sequence),映射(Mapping)。
1、集合是獨立於標量,序列和映射之外的特殊數據結構,它支持數學理論的各種集合的運算。它的存在使得用程序代碼實現數學理論變得方便。
2、序列是Python中最爲基礎的內建類型。它分爲七種類型:列表、字符串、元組、Unicode字符串、字節數組、緩衝區和xrange對象。常用的是:列表(List)、字符串(String)、元組(Tuple)。
3、映射在Python的實現是數據結構字典(Dictionary)。作爲第三種基本單位,映射的靈活使得它在多種場合中都有廣泛的應用和良好的可拓展性。
二、常見的Python數據結構
1.列表:list
我們把列表放在第一個來說明他,是因爲列表與字符串或元組不同,列表是可變的。對於“可變”和“不可變”有疑問的同學,可以查看《Python學習筆記(六)--------Python函數》,該文章對可變與不可變有詳細描述。
Python中有關list的方法
方法 | 描述 |
---|---|
list.append(x) | 把一個元素添加到列表的結尾,相當於 a[len(a):] = [x]。 |
list.extend(L) | 通過添加指定列表的所有元素來擴充列表,相當於 a[len(a):] = L。 |
list.insert(i, x) | 在指定位置插入一個元素。第一個參數是準備插入到其前面的那個元素的索引,例如 a.insert(0, x) 會插入到整個列表之前,而 a.insert(len(a), x) 相當於 a.append(x) 。 |
list.remove(x) | 刪除列表中值爲 x 的第一個元素。如果沒有這樣的元素,就會返回一個錯誤。 |
list.pop([i]) | 從列表的指定位置移除元素,並將其返回。如果沒有指定索引,a.pop()返回最後一個元素。元素隨即從列表中被移除。(方法中 i 兩邊的方括號表示這個參數是可選的,而不是要求你輸入一對方括號,你會經常在 Python 庫參考手冊中遇到這樣的標記。) |
list.clear() | 移除列表中的所有項,等於del a[:]。 |
list.index(x) | 返回列表中第一個值爲 x 的元素的索引。如果沒有匹配的元素就會返回一個錯誤。 |
list.count(x) | 返回 x 在列表中出現的次數。 |
list.sort() | 對列表中的元素進行排序。 |
list.reverse() | 倒排列表中的元素。 |
list.copy() | 返回列表的淺複製,等於a[:]。 |
實踐
myList = [1, "Baldwin", (1, 2, 4), {"Jack", "Tom"}, {"money": 40}]
newList = [43]
myList.append({"age": 18}) # 給當前列表新增一個元素
print(myList)
myList.extend(newList) # 通過制定列表來擴充當前列表
print(myList)
myList.insert(1, {"name": "Baldwin"}) # 在下表1的位置上插入
print(myList)
myList.remove(1) # 移除值爲1的元素
print(myList)
print(myList.pop(3)) # 移除指定位置元素,並返回這個元素值
myList.clear() # 刪除所有元素
print(myList)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
[1, 'Baldwin', (1, 2, 4), {'Jack', 'Tom'}, {'money': 40}, {'age': 18}]
[1, 'Baldwin', (1, 2, 4), {'Jack', 'Tom'}, {'money': 40}, {'age': 18}, 43]
[1, {'name': 'Baldwin'}, 'Baldwin', (1, 2, 4), {'Jack', 'Tom'}, {'money': 40}, {'age': 18}, 43]
[{'name': 'Baldwin'}, 'Baldwin', (1, 2, 4), {'Jack', 'Tom'}, {'money': 40}, {'age': 18}, 43]
{'Jack', 'Tom'}
[]
Process finished with exit code 0
列表在Python中的使用形式比較多,有時候也會基於列表來實現堆棧或者隊列
list實現堆棧
堆棧是一種數據結構。堆棧都是一種數據項按序排列的數據結構,只能在一端(稱爲棧頂(top))對數據項進行插入和刪除(先進後出),可以將堆棧的數據存取理解爲往水桶裏放書和取書。
list實現堆棧結構主要依託append方法和pop方法,apend方法不再累述,我們來看pop方法的特殊用法:如果沒有指定索引,a.pop()返回最後一個元素。依託這兩個方法就可以實現堆棧的數據結構要求。
stack = [1, 2, 3, 4, 5]
stack.append(6) #壓棧
print(stack)
stack.pop() #出棧
print(stack)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5]
Process finished with exit code 0
list實現隊列
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。隊列的數據存取規則可以簡說爲“先進先出FIFO”,可以理解爲排隊上車,最先排隊的人肯定是最先上車。
用列表實現隊列有一些問題,在列表尾部添加或者彈出數據是很快速的,但是要在頭部曲插入數據需要移動後面的所有數據,顯然這樣效率是很低的。
list沒有直接使用的在頭部彈出的函數,我們在此引入deque
from collections import deque
list = [1,2,3,4,5]
queue = deque(list)
print(queue.popleft()) # 出隊
print(queue)
queue.append(18) # 入隊
print(queue)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
1
deque([2, 3, 4, 5])
deque([2, 3, 4, 5, 18])
Process finished with exit code 0
列表推導式
列表推導式提供了從序列創建列表的簡單途徑。通常應用程序將一些操作應用於某個序列的每個元素,用其獲得的結果作爲生成新列表的元素,或者根據確定的判定條件創建子序列。
每個列表推導式都在 for 之後跟一個表達式,然後有零到多個 for 或 if 子句。返回結果是一個根據表達從其後的 for 和 if 上下文環境中生成出來的列表。如果希望表達式推導出一個元組,就必須使用括號。
myList = [1, 23, 87, 5]
newList = [2 * m + 1 for m in myList]
print(newList)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
[3, 47, 175, 11]
Process finished with exit code 0
以上演示了一個簡單的列表推導式,列表推導式還有很多有意思的用法,有興趣的同學可以自己去嘗試一下。
2.元組
元組由若干逗號分隔的值組成。
myTuple = (12, 78, 45, 656) # 常規方式定義元組
newTuple = 12, 11, 10 # 特殊方式
print(myTuple)
print(newTuple)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
(12, 78, 45, 656)
(12, 11, 10)
Process finished with exit code 0
元組可以通過兩種方法去創建,但是輸出時都會帶上括號,在此建議使用常規方法去創建
3.集合
集合是一個包含不重複且無需元素的數據結構,在Python中,集合具有關係測試和消除重複元素的功能。
mySet = {1231, 3123, 31231, 1212, 1212}
newSet = {m-1000 for m in mySet}
print(mySet)
print(newSet)
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
{3123, 1212, 31231, 1231}
{231, 2123, 212, 30231}
Process finished with exit code 0
上面程序運行我們可以得到3個信息:
1.集合通過大括號{}創建
2.注意觀察,我創建集合的時候輸入了兩個重複的值(最後兩個),集合雖然沒有報錯,但是自動去除了重複值
3.集合同樣支持推導式
4.字典
Python中的字典參考Java中的map類型,是一種無序雙列數據集,數據以鍵值對的形式保存,常取字符串或者數值作爲鍵,在一個字典中,鍵不能重複,但是值是可以重複的。在取值的時候可以通過鍵來取值
{}創建字典
myDict = {"name": "Baldwin", "age": 18}
print(myDict["name"])
E:\WorkSpaces\PycharmProjects\PyDemo\venv\Scripts\python.exe E:/WorkSpaces/PycharmProjects/PyDemo/cn/yzstu/__init__.py
Baldwin
Process finished with exit code 0
dict()構造函數創建字典
mydict = dict({'name': 'Baldwin', 'age': 18})
print(mydict)
通過元組+推導式創建字典
mydict = {x:x+11 for x in [1,2,3]}
print(mydict)
三、總結
各種語言數據結構萬變不離其宗,學好一門其他的也差不多