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的常用數據結構的知識,還有其他不太常用的數據結構但經常會和算法相結合,實現事半功倍的效果,這些數據結構在之后會向大家展示。

    如果你喜歡這篇文章,不妨進行點贊,或者點擊右面的打賞功能,多多支持作者,謝謝,希望大家在技術的海洋里慢慢發現美和快樂。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM