python常用數據結構講解

来源:https://www.cnblogs.com/ITXiaoAng/archive/2019/09/25/11581396.html
-Advertisement-
Play Games

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 常量池 可以理解為Class文件之中的資源倉庫,他是Class文件結構中與其他項目關聯最多的數據類型,也是占用Class文件空間最大的數據項目之一 訪問標誌 在常量池結束後,緊接著的倆個位元組代表訪問標誌(access_flags),這個標誌用於識別一些類或者介面層次的訪問信息。包括:這個Class是 ...
  • Tomcat控制臺中看到的日誌是伺服器的日誌,而伺服器訪問日誌則是記錄服務處理的請求信息。 ...
  • 對於想學習和實踐zabbix的讀者來說,在真實環境搭建一套zabbix系統是件費時費力的事情,本文內容就是用docker來縮減搭建時間,目標是讓讀者們儘快投入zabbix系統的體驗和實踐; 環境信息 以下是本次操作的環境: 1. 操作系統:MacBook Pro 2. Docker:19.03.2 ...
  • 筆記: 安裝docker的命令 curl -sSL https://get.docker.com/ | sh service docker start 排查錯誤的命令 strace 視頻地址在此:https://www.bilibili.com/video/av68889436/ ...
  • Jupyter Notebook 現已成為數據分析,機器學習的必備工具。因為它可以讓數據分析師集中精力向用戶解釋整個分析過程。通過安裝一些擴展工具,可以讓你在Jupyter Notebook上的工作效率進一步的提高。 Jupyter NbExtensions Configurator Jupyter ...
  • 安裝ptyhon3.7 sudo apt-get update sudo apt-get install python3.7 安裝成後的目錄在/usr/bin/python3.7,同時將其設置成預設 sudo update-alternatives --install /usr/bin/python ...
  • DRF框架中鏈表數據通過ModelSerializer深度查詢方法彙總 一.準備測試和理解準備 創建類 生成表單數據 Test1 id| test_2_id_id | 1|1 2|2 Test2 id|name | 1|名字1 2|名字2 二.深度查詢通過Test1獲得Test2的name而不是id ...
  • 需求:隨機生成驗證碼, 思路: 1.生成一個隨機數,65-90 2.數字轉化為字母:chr(數字) 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import random 5 temp = "" 6 for i in range(6): ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...