1. 程式人生 > 其它 >Python中的list列表

Python中的list列表

列表list

  • 一個佇列,一個排列整齊的隊伍
  • 列表內的個體稱作元素,由若干元素組成列表
  • 元素可以是任意物件
  • 列表內元素有順序,可以索引
  • 線性資料結構
  • 使用[]表示
  • 列表是可變的

列表list定義

  • list()
  • list(iterable)
  • 列表不可一開始定義大小
lst = list()
lst = list(range(5))
lst = [1,3,5]

列表訪問

  • 索引,可使用索引訪問
  • 支援正索引和負索引

列表查詢

  • Index(value, [start. [stop]])
    • 通過值,從指定區間查詢元組內的元素是否匹配
    • 匹配第一個返回索引
    • 匹配不到,丟擲異常ValueError
  • count(value)
    • 返回列表中匹配value的次數
  • 時間複雜度
    • index和count方法都是O(n)
    • 隨著列表資料規模增大, 效率降低
  • len(tuple)
    • 返回元素的個數

列表修改

  • 索引訪問修改
    • list[index] = value
    • 索引不能超界

列表增加,插入

  • append(object) —> None
    • 列表尾部追加元素,返回None
    • 返回None意味著在列表原處修改
    • 時間複雜度是O(1)
  • insert(index, object) —> None
    • 在指定的索引index出插入元素object
    • 原處修改
    • 時間複雜度是O(n)
    • 索引超越上界,尾部追加
    • 索引超越下界,頭部追加
  • extend(iteratable) —>None
    • 將可迭代物件的元素追加進來
    • 原處修改
  • + —> list
    • 連線操作,將兩個列表連線起來
    • 產生新的列表,原列表不變
    • 本質上呼叫的是_add_()方法
  • * —> list
    • 重複操作,將本列表元素重複n次,返回新列表

刪除元素

  • remove(value) —>None
    • 從左至右查詢第一個匹配value的值
    • 就地修改
    • 效率較差
  • pop([inex]) —>None
    • 不指定索引index,就從尾部彈出一個元素
    • 指定索引index,就從索引出彈出一個元素
    • 不指定索引效率為O(1),指定索引為列表最開始的位置,則效率很低
  • clear() —>None
    • 清楚列表所有元素,剩下一個空列表

列表反轉

  • reversed() —>None
    • 將列表元素反轉,返回None
    • 就地修改
    • 所有元素替換位置

列表排序

  • sort(key=None, reverse=False). —>None
    • 對列表元素進行排序,就地修改,預設升序
    • reverse為True,則為降序
    • key是一個函式,指定key如何排序
      • Let.sort(key=functionname)

列表判斷

  • in

    • 判斷物件是否在列表中
    [3, 4] in [1, 2, [3, 4]]
    

列表複製

python中==和is的區別

  • ==是拿值來比較
  • is是拿id來比較
例:list1=list(range(5))
		list2=list(range(5))
		list1 == list2  返回 True
		list1 is list2   返回False
  • copy() —>List

    • shodow copy(淺拷貝)返回一個新的列表
    In [3]: lst0 = [1,2,[3,4,5],6]
    # copy為淺拷貝,即按照lst0的內容生成lst5
    In [4]: lst5 = list.copy(lst0)
    # 此時lst0和lst5的值一樣,所以==判斷為True
    In [5]: lst0 == lst5
    Out[5]: True
    # 但是id不同,故is判斷為False
    In [6]: lst0 is lst5
    Out[6]: False
    # 修改lst0[3]的值,觀察變化
    In [7]: lst0[3] = 20
    # 此時lst0和lst5的值不一樣,所以==判斷為False
    In [8]: lst0 == lst5
    Out[8]: False
    # 可觀察lst0和lst5的值
    In [9]: lst0
    Out[9]: [1, 2, [3, 4, 5], 20]
    
    In [10]: lst5
    Out[10]: [1, 2, [3, 4, 5], 6]
    # 將lst的值恢復
    In [13]: lst0[3] = 6
    
    In [14]: lst0 == lst5
    Out[14]: True
    # 修改lst0中巢狀的列表的值,觀察變化
    In [15]: lst0[2][2]= 20
    # 雖然只修改了lst0,但lst0和lst5的值依舊相同,原因就在於copy為淺複製,對於巢狀的其他物件,只是做了物件的引用而已
    In [16]: lst0 == lst5
    Out[16]: True
    
    In [17]: lst0
    Out[17]: [1, 2, [3, 4, 20], 6]
    
    In [18]: lst5
    Out[18]: [1, 2, [3, 4, 20], 6]
    
  • deepcopy(old) —>List

    • 深拷貝,無論有多少巢狀,得到的列表都和原來的無關。
    • 使用時,要匯入copy
    In [21]: import copy
    
    In [22]: lst8 = [1, 2, [3, 4, 20], 6]
    
    In [23]: newlist = copy.deepcopy(lst8)
    
    In [24]: lst8 == newlist
    Out[24]: True
    
    In [25]: lst8 is newlist
    Out[25]: False
    # 無論有多少層,都不會影響舊列表
    In [26]: newlist[2][2] = 80
    
    In [27]: lst8 == newlist
    Out[27]: False
    
    In [28]: lst8
    Out[28]: [1, 2, [3, 4, 20], 6]
    
    In [29]: newlst
    
    In [30]: newlist
    Out[30]: [1, 2, [3, 4, 80], 6]