Python學習筆記(七)--------Python數據結構

一、相關

數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。

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)

三、總結

各種語言數據結構萬變不離其宗,學好一門其他的也差不多

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章