數據結構知識點(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

相關推薦

  • Nginx:

    來自為知筆記(Wiz)

    Linux干貨 2016-10-26
  • Linux基礎知識之網絡配置

    基本網絡配置:     將Linux主機接入到網絡,需要配置網路相關設置。         IP/NETMASK:本地通信         路由(網關):跨網絡…

    Linux干貨 2016-09-07
  • linux文件系統掛載

    掛載mount 掛載:     將額外文件系統與根文件系統某現存的目錄建立起關聯關系,進而使得此目錄做為其它文件訪問入口的行為 卸載:     為解除此關聯關系的過程 把設備關聯掛載點:mount Point mount 卸載時:    &…

    Linux干貨 2016-08-29
  • 如何配置本地yum源

    在日常學習中配置本地yum源至關重要,下面簡單介紹下centos7如何配置本地yum源: 1、開機啟動前檢查是否將光盤鏡像加載,然后開機; 2、cd /run/media/root/CentOS 7 x86_64下找到Packages和repodata這兩個包非常重要,其中Packages是rpm包目錄,repodata是元數據 3、cd /etc…

    Linux干貨 2017-04-23
  • N25-第十三周博客作業

    1、建立samba共享,共享目錄為/data,要求:(描述完整的過程) 1)共享名為shared,工作組為magedu;2)添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop為附加組,ubuntu不屬于develop組;密碼均為用戶名;3)添加samba用戶gentoo,centos和ubu…

    Linux干貨 2017-04-19
  • 基于samba服務的wordpress站點

    實驗要求:             (1) samba server導出/data/app/web,在目錄中提供wordpress;     (2) samba  client掛載nfs server導出的文件…

    2017-06-08
欧美性久久久久