[TOC] 一:序列 在數學上,序列是被排成一排的對象,而在python中,序列是最基本的數據結構。它的主要特征為擁有索引,每個索引的元素是可迭代對象。都可以進行索引,切片,加,乘,檢查成員等操作。在python中,有六種內建的索引,但是常用的是列表,元組,字元 ...
目錄
一:序列
在數學上,序列是被排成一排的對象,而在python中,序列是最基本的數據結構。它的主要特征為擁有索引,每個索引的元素是可迭代對象。都可以進行索引,切片,加,乘,檢查成員等操作。在python中,有六種內建的索引,但是常用的是列表,元組,字元串,下麵就進行介紹。
1. 列表
定義:列表是把需要的數據類型進行封裝,類似c語言的結構體。而且列表是動態可變的。
基本操作方法:
count():統計某個元素在列表中出現的次數。
index():從列表中找出某個值第一個匹配項的索引位置。
append():在列表末尾添加新對象。
extend():在列表末尾一次性追加另一個序列的多個值。
insert():在列表的指定位置插入對象。
pop():移除列表中的一個元素(預設最後一個元素),並且返回該元素的值。
remove():移除列表中某個值的第一個匹配項。
reverse():將列表中的元素反向,不重新拷貝一個列表。
reversed():將列表中的元素反向,重新拷貝一個列表。
sort():將列表中的元素排序,不重新拷貝一個列表。
sortd():將列表中的元素排序,重新拷貝一個列表。
copy():淺拷貝,只是給原來的列表貼上了一個新標簽,對於一個複雜對象的子對象並不會完全複製,如果有子列表,改變原來的值,新的拷貝對象也會改變。
deepcopy():深拷貝,將複雜對象的每一層複製一個單獨的個體出來。就是完全拷貝。
2.元組
定義:元組是不可變的,有時候可以看成不可變的列表。但元組可以進行連接組合與切片,且只含一個值的列表,必須要用","才行。
基本操作方法:
del:刪除元組。
3.字元串
字元串是 Python 中最常用的數據類型。用成對引號創建即可。
基本操作方法:
format():格式化字元串。
4.通用序列操作方法
index:索引,既可以從0開始,也可以從最後一個位置開始。
[:]:分片,用來訪問一定範圍內的元素。
常用算術操作符:相同類型序列可以進行算術運算或者複製序列。
in:成員操作符,用來檢查一個對象是否為某個序列(或者其他類型)的成員(即元素)。
len,max,min:內建函數len、max和min可以返回序列中所包含元素的數量、最大和最小元素。
5.字典
定義:字典是映射,根據哈希表的原則,映射中元素的名字叫鍵。字典(也叫散列表)是Python中唯一內建的映射類型。字典中的元素的鍵可以是任何對象,但必須是不可變對象。比如序列中的集合和列表等可變對象,不能作為字典的鍵。
基本操作方法:
clear():清空字典。
pop(): 移除鍵,同時返回此鍵所對應的值。
copy():複製字典,只複製一層(淺拷貝)。
update(DD):將字典 DD 合併到D中,如果鍵相同,則此鍵的值取DD的值作為新值。
get(key, default):返回鍵key所對應的值,如果值不存在,則返回default。
keys():返回可迭代的字典的鍵的集合對象。
values():返回可迭代的字典的值的集合對象。
items():返回可迭代的字典的鍵值對的集合對象。
6.集合
定義:集合是由序列(或者其他可迭代的對象)構成的,是一個無序的不重覆元素序列。
基本操作方法:
frozenset():創建一個空的固定集合對象。
frozenset(iterable):用可迭代對象創建一個新的固定集合對象。
set():創建一個空的集合對象(不能用{}來創建空集合)。
set(iterable):用可迭代對象創建一個新的集合對象。
add(e):在集合中添加一個新的元素e;如果元素已經存在,則不添加。
remove(e):從集合中刪除一個元素,如果元素不存在於集合中,則會產生一個KeyError錯誤。
discard(e):從集合S中移除一個元素e,在元素e不存在時什麼都不做。
clear():清空集合內的所有元素。
copy():對集合進行一次淺拷貝。
pop():從集合S中刪除一個隨機元素;如果此集合為空,則引發KeyError異常。
update(s2):更新字典。
二:高級數據結構
python還有一些高級數據結構,這些數據結構在進行演算法運算時十分有用。下麵就進行講解。
1.棧
定義:棧是一種線性表,只允許從一端插入和刪除數據,棧的插入和刪除只能在棧頂進行。棧有兩種存儲方式,即線性存儲和鏈接存儲(鏈表)。所以每次刪除的元素都是最後進棧的元素,故棧也被稱為後進先出(LIFO)表。每個棧都有一個棧頂指針,它初始值為-1,且總是指向最後一個入棧的元素。
棧有兩種處理方式,即進棧(push)和出棧(pop),進棧時只需要移動一個變數存儲空間,時間複雜度為O(1);但是對於出棧分兩種情況,棧未滿時,時間複雜度也為O(1), 但是當棧滿時,需要重新分配記憶體,並移動棧內所有數據,所以此時的時間複雜度為O(n) 。
python中棧:在python中,棧其實可以用更加簡單的列表實現,用append在末尾進行增加元素操作,用pop進行刪除元素操作。
列表簡單實現:
stack = []
# 向棧頂插入元素
stack.append(1)
stack.append(2)
stack.append(3)
# 刪除棧頂的元素
print(stack.pop())
print(stack.pop())
print(stack.pop())
普通方法實現:
class MyStack(object):
def __init__(self):
self.stack_list = [] # 自定義一個列表
self.count = 0 # 創建一個計數器,模擬棧頂指針
# 創建一個棧
def create_one_stack(self):
return self.stack_list
# 在棧頂添加元素
def push(self, value):
self.stack_list.insert(0,value)
self.count += 1 # 計數器加一
# 刪除棧頂元素
def pop(self):
self.stack_list.pop(0)
self.count -= 1 # # 計數器減一
# 返回棧頂元素值
def stack_num(self):
if self.count:
return self.stack_list[0]
#列印棧內容
def show_all(self):
for s in self.stack_list:
print(s)
if __name__ == '__main__':
m = MyStack()
m.create_one_stack()
# 增加棧頂元素
m.push(1)
m.push(2)
m.push(3)
print('棧頂元素為:',m.stack_num())
print('之前的元素為:')
m.show_all()
# 刪除棧頂元素
m.pop()
print('之後的元素為:')
m.show_all()
2.隊列
定義:隊列是一種特殊的線性表,和棧類似,但是在允許表的前面進行刪除操作,而在表的後面進行插入操作,也是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。分為順序隊列和迴圈隊列。這裡先討論順序隊列。
普通隊列實現:
class Queue(object):
def __init__(self):
self.__list = [] # 創建一個列表
def inQueue(self,item):
# 從隊尾入隊,從隊頭出隊
self.__list.append(item)
def outQueue(self):
# 從隊頭出隊
return self.__list.pop(0)
if __name__ == '__main__':
m = Queue()
# 從隊頭入隊
m.inQueue(1)
m.inQueue(2)
# 從隊尾出隊
print(m.outQueue())
print(m.outQueue())
雙端隊列實現:
class Queue(object):
def __init__(self):
self.__list = [] # 創建一個列表
def add_Front(self,x):
#在列表頭部添加
self.__list.insert(0,x)
def add_End(self,x):
#在隊列尾部添加元素
self.__list.append(x)
def pop_Front(self):
#在頭部刪除元素
return self.__list.pop(0)
def pop_End(self):
#在尾部刪除元素
return self.__list.pop()
if __name__ == '__main__':
m = Queue()
# 在隊列頭部添加元素
m.add_Front(1)
m.add_Front(2)
m.add_Front(3)
m.add_Front(4)
# 在隊列尾部添加元素
m.add_End(5)
m.add_End(6)
m.add_End(7)
m.add_End(8)
# 在列表頭部和尾部刪除元素
print(m.pop_Front())
print(m.pop_Front())
print(m.pop_End())
print(m.pop_End())
以上就是python的常用數據結構的知識,還有其他不太常用的數據結構但經常會和演算法相結合,實現事半功倍的效果,這些數據結構在之後會向大家展示。
如果你喜歡這篇文章,不妨進行點贊,或者點擊右面的打賞功能,多多支持作者,謝謝,希望大家在技術的海洋里慢慢發現美和快樂。