Python基礎(二)—列表和元組

List&Tuple

List是一個可變序列類型。因此,您可以通過添加或刪除元素來更改給定的列表。元組是不變序列類型。你不能換一個元組。所以你必須創建一個新的。

  • List
    • 創建:listTmp = [] , listTmp = [‘listtmp’, 2017, 2018, 2019]
    • 訪問:通過下標進行訪問(和字符串同樣可以使用切片),listTmp[0] , listTmp[1,3]
    • 增加:append()、或者通過下標進行組合新增或刪除等操作。listTmp.append(2020) # ‘listtmp’, 2017, 2018, 2019, 2020
    • 刪除:listTmp.pop()(該方法默認刪除最後一個)、 listTmp.remove(2018)(移除列表中某個值的第一個匹配項)、 del listTmp2
      listTmp = [2, 5, 7, '2019', '2010', 'ABCD']
      print(listTmp.pop())
    
      listTmp.remove(7)
      print(listTmp)
    
      del listTmp[2]
      print(listTmp)
      '''
      ABCD
      [2, 5, '2019', '2010']
      [2, 5, '2010']
      '''
    
    
  • Tuple
    • 創建:tupleTmp = () , tupleTmp = (‘listtmp’, 2017, 2018, 2019)
    • 訪問:通過下標進行訪問(和字符串同樣可以使用切片),tupleTmp[0] , tupleTmp[1,3]
    • 增加:元組中的元素值是不允許修改的,但我們可以對元組進行連接組合。
    • 刪除:元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組。
      tupleTmp = ('loak', 2017, 2018, 2019)
    
      print(tupleTmp[0])
      tupleTest = 1
      newTuple = tupleTmp + (tupleTest,)  # 元組中的元素只能連接組合進行增加
      print(newTuple)'
    
      del tupleTmp
    
    

列表和元組的運算

  • 列表
    列表對 + 和 * 的操作符與字符串相似。+ 號用於組合列表,* 號用於重複列表。
Python 表達式 結果 描述
len([1, 2, 3]) 3 長度
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 組合
[‘Hi!’] * 4 [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] 重複
3 in [1, 2, 3] True 元素是否存在於列表中
for x in [1, 2, 3]: print(x, end=" ") 1 2 3 迭代
  • 元組
    與字符串一樣,元組之間可以使用 + 號和 * 號進行運算。這就意味着他們可以組合和複製,運算後會生成一個新的元組。
Python 表達式 結果 描述
len((1, 2, 3)) 3 計算元素個數
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) 連接
(‘Hi!’,) * 4 (‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’) 複製
3 in (1, 2, 3) True 元素是否存在
for x in (1, 2, 3): print (x,) 1 2 3 迭代

內置函數

  • 列表
序號 函數 描述
1 len(list) 列表元素個數
2 max(list)、min(list) 返回列表元素最大、最小值
3 list(seq) 將元組轉換爲列表
4 list.append(obj) 在列表末尾添加新的對象
5 list.count() 統計某個元素在列表中出現的次數
6 list.extend(seq) 在列表末尾一次性追加另一個序列中的多個值(用新列表擴展原來的列表)
7 list.index(obj) 從列表中找出某個值第一個匹配項的索引位置
8 list.insert(index, obj) 將對象插入列表
9 list.pop([index=-1]) 移除列表中的一個元素(默認最後一個元素),並且返回該元素的值
10 list.remove(obj) 移除列表中某個值的第一個匹配項
11 list.reverse() 反向列表中元素
12 list.sort( key=None, reverse=False) 對原列表進行排序
13 list.clear() 清空列表
14 list.copy() 複製列表
  • 元組
序號 函數 描述
1 len(tuple) 計算元組元素個數
2 max(tuple)、min(tuple) 返回元組元素最大、最小小值
3 tuple(seq) 將列表轉換爲元組

關於列表和元組的深淺複製

  • Python對象和變量的管理
    Python沒有C語言中的變量。在C語言中,變量不止是個名字,它是字節集合並真實存在於內存某個位置上。而在Python中,變量僅僅是指向對象的標籤。
      a = [1, 2, 3]  # 表示我們創建了一個指引指向列表[1, 2, 3],但是a不是列表
    
      b = a  # 此時並沒有複製a所指引的列表。我們只是創建了一個新的標籤b,然後將其指向a所指向的列表。如果修改a,那你就同時修改了b,因爲它們指向同一個列表。
    
      # 可以使用內建函數id()可以返回對象的唯一id。該id是對象的內存地址。
      c = []
      print(id(a))
      print(id(b))
      print(id(c))
      '''輸出:
        10784000
        10784000
        10304448
      '''
    

淺複製.png

  • 五種複製方式的比較

      import copy
      a = [[1], 2, 3]
      b = a[:]
      c = list(a)
      d = a * 1
      e = copy.copy(a)
      f = copy.deepcopy(a)
    
      a[0].append(4)
    
      print('a                ', id(a), a)
      print('a[:]             ', id(b), b)
      print('list(a)          ', id(c), c)
      print('a * 1            ', id(d), d)
      print('copy.copy(a)     ', id(e), e)
      print('copy.deepcopy(a) ', id(f), f)
      '''
        a                 9303824 [[1, 4], 2, 3]
        a[:]              9304864 [[1, 4], 2, 3]
        list(a)           9004416 [[1, 4], 2, 3]
        a * 1             9304824 [[1, 4], 2, 3]
        copy.copy(a)      9304784 [[1, 4], 2, 3]
        copy.deepcopy(a)  9304744 [[1], 2, 3]
      '''
    

    從以上可以看出,使用 a[:], list(a), a*1, copy.copy(a)四種方式複製列表結果都可以得到一個新的列表,但是如果列表中含有列表,所有b, c, d, e四個新列表的子列表都是指引到同一個對象上。只有使用copy.deepcopy(a)方法得到的新列表f纔是包括子列表在內的完全複製。

  • 深複製

    • 列表深複製:a[:]、list(list)、copy.deepcopy(a)
      上例爲淺複製,如果需要深複製a指引的列表。我們必須創建新的列表,然後使用變量來指引它。可以使用切片a[:]或者list(list)來實現全複製。當使用copy.copy(a)時,如果a中嵌套有列表,則嵌套的列表是淺複製。

        a = [1, 2, 3]
      
        b = a[:]
        # b = list(a)
        # import copy
        # b = copy.deepcopy(a)
        print(id(a))  # 10652928
        print(id(b))  # 10653408  使用a[:]已成功複製
      
      
    • 其他注意事項
      還接受生成器。切片筆記法不適用於生成器,因爲生成器是不可更改。因此不能generator[0]。

        >>> generator = (x * 3 for x in range(4))
        >>> list(generator)
        [0, 3, 6, 9]
      
      

      百分之九十的切片標記法都可以被list()代替。下次你看見[:]的時候試試使用list()替代,這樣可以讓代碼更加可讀。

      複製內容參照文章

個人博客:Loak 正 - 關注人工智能及互聯網的個人博客
文章地址:Python基礎(二)—列表和元組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章