數據結構知識點(list,tuple,冒泡法)

分類

  • 數值型
    int、float、complex、bool
  • 序列對象
    字符串str、列表list、tuple
  • 鍵值對
    集合set、字典dict

數值型

  • complex:有實數和虛數部分組成
  • float:有整數和小數組成。只有雙精度

類型轉換

  • int(X) 返回一個整數
  • float(x) 返回一個浮點數
  • complex(x)、complex(x,y) 返回一個復數
  • bool(x) 返回布爾值

數字的處理函數

  • round() 四舍六入五取偶
    數據結構知識點(list,tuple,冒泡法)
  • floor() 地板,往下取
    ceil() 天花板,往上取
    數據結構知識點(list,tuple,冒泡法)
  • min()
    max()
    pow(x,y) 等于x**y
    math.sqrt()
  • 進制函數
    bin()
    oct()
    hex()
  • math.pi π
    math.e 自然常數e

類型判斷

  • type(obj),返回類型,而不是字符串
  • isinstance(obj,class_or_tuple),返回布爾值
  • 示例
    數據結構知識點(list,tuple,冒泡法)

列表list

  • 特點
    sequence
    item (could be anything)
    線性的數據結構
    列表是可變
    使用[]表示
  • 定義
    list(iterable) -> new list initialized from iterable’s items

索引,也叫下標

  • 正索引:從左至右,從0開始,為列表中每一個元素編號
  • 負索引:從右至左,從-1開始
  • 正負索引不可以超界
  • 左邊是頭部,右邊是尾部,左邊是下界,右邊是上界
  • 列表通過索引訪問
    list[index],index就是索引,使用中擴號訪問

列表查詢

  • index(value,[start,[stop]])
    通過值value,從指定區間查找列表內的元素是否匹配
    匹配第一個值就立即返回索引
  • count(value)
    返回列表中匹配value的次數
  • 時間復雜度
    index和count都是O(n)
    隨著列表數據規模越大,效率越低
  • len()
    獲得list元素的個數

列表基本操作

  • list[index] = value
  • append(obj) -> None
    尾部追加元素,返回None
    就地修改
    時間復雜度O(1)

    lst=[2,3]
    lst.append(1)
    
  • insert(index,object) ->None #很少用到
    超越上界,尾部追加
    超越下屆,頭部追加
  • extend(iteratable) -?None
    將可迭代對象的元素追加進來,返回None,就地修改
  • + ->list
    將兩個列表連接起來,產生新的列表
  • * ->list
    重復操作,將本列表元素重復n次,返回新的列表
    數據結構知識點(list,tuple,冒泡法)
    # a=[[1]]*3只是復制了引用(門牌號),當對三者中任何一個發生改變,其他兩個也會相應的改變
    # b=[[1],[1],[1]]里面就是不同的三個引用

  • remove(value) -> None
    從左至右查找第一個匹配value的值,移除該元素,返回None
    就地修改 #用的比較少,一般用pop
  • pop(index) ->item
    不指定索引index,就從列表尾部彈出一個元素
  • clear() ->None
    清楚列表所有元素,剩下一個空列表
  • reverse() ->None
    將列表元素反轉
  • sort(key=None,reverse=False) ->None
    對列表元素進行排序,就地修改,默認升序
    reverse為True,反轉,降序
    key為一個函數,指定key按照什么規則排序
  • in
    [3,4] in [1,2,[3,4]]
    for x in [1,2,3,4]

列表復制

  • copy() -> list

數據結構知識點(list,tuple,冒泡法)

  • shadow copy
    淺拷貝,遇到引用類型,只是復制了一個引用而已(記下了門牌號)
    數據結構知識點(list,tuple,冒泡法)
  • 深拷貝
    import copy
    lst=[1,2,[3,4],5]
    lst1=copy.deepcopy(lst)
    lst[2][1]=20
    lst==lst1,lst is lst1
    

    數據結構知識點(list,tuple,冒泡法)


隨機數

  • random模塊
  • randint(a,b) 返回[a,b]之間的整數
  • choice(seq) 從非空序列的元素中隨機挑選一個元素,比如random.choice(range(10))
  • randrange 從集合中獲取一個號隨機數
    random.randrange)(1,7,2)
  • random.shuffle(list) ->None
    就地打亂列表元素

注意

  • 列表list用for循環進行遍歷的時候,會出錯,不建議這樣使用
    • 例1
      數據結構知識點(list,tuple,冒泡法)
    • 例2 ,利用index來遍歷刪除
      數據結構知識點(list,tuple,冒泡法)
      這樣雖然刪除了,但是列表l變成l=[1,2,3,4,5],就報錯了
      數據結構知識點(list,tuple,冒泡法)
      range的開始范圍是0-4,中間遍歷的時候刪除了一個元素4,這個時候列表就變成了l=[1,2,3,5],這時候就會報錯了,提示超界,原因就是遍歷的時候刪除了元素

tuple 元組

  • 特點
    一個有序的元素組成的集合
    使用()表示
    不可變對象

    • 元組是只讀的,增、改、刪都沒有
  • 定義
    tuple(iterable) -> tuple initialized from iterable’s items

    t=tuple()
    t=(1,2,3,4)
    t=(1,)  #一個元素定義必須有逗號
    

索引

  • 知識點同list
  • 元組通過索引訪問
    tuple[index],index就是索引,使用中擴號訪問

    t[-1]=4
    

查詢

  • 查詢同list
  • 主要記住 len(tuple)

命名元組namedtuple

  • namedtuole(typename,field_names,verbose=False,rename=False)
    • 命名元組,返回一個元組的子類,并定義了字段
    • field_names可以是空格或逗號分割的字段的字符串,可以是字段的列表

數據結構知識點(list,tuple,冒泡法)


冒泡法

  • 交換排序
  • 第一輪比較,需要比較n-1次,第二輪是n-2次,以此類推,最后只剩下兩個數比較
  • 最差的排序情況是,初始順序與目標順序完全相反,遍歷次數就是n-1,……,1的和n(n-1)/2
    • 例如[4,3,2,1]要求升序排序[1,2,3,4]
  • 最好的排序情況是,初始順序與目標順序相同,遍歷n-1次
  • 時間復雜度O(n2)

  • 簡單冒泡法實現
    numlist = [[1,9,8,5,6,7,4,3,2],[1,2,3,4,5,6,7,8,9]]
    nums = numlist[1]
    print(nums)
    length = len(nums)
    count_swap = 0 
    count = 0
    
    for i in range(length):
        for j in range(length-i-1):
            count += 1
            if nums[j] > nums[j+1]:
                tmp = nums[j]
                nums[j] = nums[j+1]
                nums[j+1] = tmp
                count_swap += 1
    print(nums,count_swap,count)
    
    #  count_swap是為了查看交換的次數
    #  count是為了查看進行了多少次比較(包括沒有交換的比較)
    

  • 優化版(錯誤示范)
    numlist = [[1,9,8,5,6,7,4,3,2],[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,9,8]]
    nums = numlist[1]
    print(nums)
    length = len(nums)
    count_swap = 0
    count = 0
    flag=False        
    
    for i in range(length):
        for j in range(length-i-1):
            count += 1
            if nums[j] > nums[j+1]:
                tmp = nums[j]
                nums[j] = nums[j+1]
                nums[j+1] = tmp
                flag = True
                count_swap += 1
        if not flag:
            break
    print(nums,count_swap,count) 
    

    數據結構知識點(list,tuple,冒泡法)

    #  flag=Flash放錯位置了,放在最上面不起作用,只有放在for i循環下面才起作用。
    #  如果for j的第一次循環沒有比較的話(也就是123456789這樣的排序),那么這次循環后就會結束,其他的情況都是在第一次循環會進行比較交換,也就是執行了if語句,那么flag就變成了True,這樣在后面的循環中,哪次循環沒有比較才會break。
    #  這樣大大提高了效率
    

  • 優化(正確) *****記住
    numlist = [[1,9,8,5,6,7,4,3,2],[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,9,8]]
    nums = numlist[1]
    print(nums)
    length = len(nums)
    count_swap = 0
    count = 0
    
    for i in range(length):
        flag = False
        for j in range(length-i-1):
            count += 1
            if nums[j] > nums[j+1]:
                tmp = nums[j]
                nums[j] = nums[j+1]
                nums[j+1] = tmp
                flag = True
                count_swap += 1
        if not flag:
            break
    print(nums,count_swap,count)
    

    數據結構知識點(list,tuple,冒泡法)

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87559

(0)
nolannolan
上一篇 2017-09-24 23:34
下一篇 2017-09-25 09:42

相關推薦

  • LVM——如何讓你的磁盤空間可大可小

    邏輯卷管理器(LVM) 允許對卷進行方便操作的抽象層,包括重新設定文件系統的大小 允許在多個物理設備間重新組織文件系統          將設備指定為物理卷          用一個或者多個物理卷來創…

    Linux干貨 2016-08-29
  • 談shell命令的神奇組合以及對腳本的影響

    shell命令是我們與機器交互的基本溝通翻譯官。我們要告訴計算機的很多事情都由它來翻譯,而shell的神奇之處就在于支持命令聯合使用,現在我就來講講基本的命令組合引用。1.管道應用:命令 | 命令  ,前面的命令的結果可以直接作為后面命令的輸出,省卻了一個變量做存儲。2.文本段落提?。晃覀兛梢杂?組合命令 通常為 cat 某文件 | (head -…

    Linux干貨 2017-04-02
  • 加密的應用

    加密的應用 一、實現對稱加密 1、openssl enc man enc 算法:3des, aes, blowfish, twofish 加密操作:openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher 解密操作:openssl enc  -d -des3 -a  -…

    Linux干貨 2016-09-26
  • 推薦-虛擬化網絡之OpenvSwitch(二)

    上一篇介紹了openvswitch的基礎知識,接下來我們來做一個實驗,利用GRE通道搭建一個跨多宿主機的虛擬化網絡,深入了解openvswitch的功能。 一、實驗拓撲 ip地址分配:  A1:192.168.10.1/24  A2:192.168.10.10/24   B1:192.168.10.2/24 &nbsp…

    2016-03-27
  • 馬哥教育網絡班21期第8周課程練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。 網橋也叫橋接器,是連接兩個局域網的一種存儲/轉發設備,用來連接不同網段。 集線器稱為“Hub”,主要功能是對接收到的信號進行再生整形放大,以擴大網絡的傳輸距離,同時把所有節點集中在以它為中心的節點上。 二層交換機工作于OSI模型的第2層(數據鏈路層),可識別數據包中的MAC地址信…

    Linux干貨 2016-09-19
欧美性久久久久