iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Software Development

Python 微進階系列 第 5

Python 微進階 Day05 - list(串列)

  • 分享至 

  • xImage
  •  

list

  • 使用 []list() 建立
  • []False
  • 有序的(sequence),可以改變內容與大小

內容會談到

  • 從 0 開始的索引和有頭無尾的切片
  • 排序方法
  • 多層 list
  • 深、淺拷貝

索引、切片

  • index(索引)以 0 開頭,可用 -1 代表最後一個
  • slicing(切片):用 [index1:index2:間隔] 表示
    • index1:表示從此開始,未填表示從最初(0)開始
    • index2:不包含 index2,到 index2 前一個結束,未填表示到最後
    • 間隔:預設是 1,-1 可用來倒轉順序
  • [m:n]:切片範圍 m 到 n-1,有頭無尾
    • 計算長度(份數)為 n-m,不用再補 1
    • 方便直接取幾份(長度),[m:m+n] 表從 m 開始,切出 n 個

a = [1, 2, 3, 4, 5]

a[2:]
a[:-1]
a[::2]
a[::-1]

# [3, 4, 5]
# [1, 2, 3, 4]
# [1, 3, 5]
# [5, 4, 3, 2, 1]

a[2:] = "test"
a[2:] = ["test"]

# [1, 2, 't', 'e', 's', 't']
# [1, 2, 'test']

常見處理方法

  • append(元素):附加元素到 list 的最後
  • extend(元素):將 list 拆開附加到 list 的最後
  • insert(位置, 元素):插入指定元素的位置,原位置往後,若超過則為最後一個
  • del:刪除指定(範圍)的值
  • remove(值):刪除找到的第一個值
  • reverse():反轉
a = [1, 2, 3, 4, 5]

a.append(10)
a.insert(10, "test")
del a[-1]
a.remove(10)
a.reverse()

# [1, 2, 3, 4, 5, 10]
# [1, 2, 3, 4, 5, 10, 'test']
# [1, 2, 3, 4, 5, 10]
# [1, 2, 3, 4, 5]
# [5, 4, 3, 2, 1]
a = [1, 2, 3, 4, 5]
b = [6, 7]

a.append(b)
a.extend(b)

# [1, 2, 3, 4, 5, [6, 7]]
# [1, 2, 3, 4, 5, 6, 7]

排序 sort()sorted()

  • list.sort():屬於 list 的方法,其他種不能使用
  • sorted(list):屬於函式,會回傳一個新 list,不會改動原本的,其他種可以使用
a = [3, 2, 1, 4, 5]
b = sorted(a)
print(b)
# [1, 2, 3, 4, 5]
print(a)
# [3, 2, 1, 4, 5]

a.sort()
print(a)

# [1, 2, 3, 4, 5]

多層 list

  • [] 內還可以放 [],如 [[], [], []]
  • 先指向第 1 層的位置順序,再指向第 2 層的位置順序
  • li[位置1][位置2]
  • 想要作多維度的複雜運算,建議改使用 numpy
a = [[0, 1, 2], [10, 11, 12], [20, 21, 22]]

a[1]
# [10, 11, 12]

a[1][2]
# 12

淺拷貝(shallow)與深拷貝(deep)

  • b = a= 是賦值,屬於引用(記憶體位置相同),a 改變,b 會跟著改變
  • 淺拷貝(shallow):複製表層(記憶體位置已不同),內部的子對象(下一層)為參照(記憶體位置相同)
    • b = a[:]
    • b = a.copy()
    • b = copy.copy(a),需 import copy
  • 深拷貝(deep):複製表層與深層(記憶體位置不同),會遞迴去將內部的子對象(下一層)複製
    • b = copy.deepcopy(a),需 import copy
  • 可用 id(變數) 檢查記憶體位置
# 賦值
a = [[0, 1], [0, 2]]
b = a

a.append([0, 3])

print(a)
print(b)
# [[0, 1], [0, 2], [0, 3]]
# [[0, 1], [0, 2], [0, 3]]
# 淺拷貝
import copy

a = [[0, 1], [0, 2]]
b = copy.copy(a)
# b = a.copy()

a.append([0, 3])

print(a)
print(b)
# 表層不受影響
# [[0, 1], [0, 2], [0, 3]]
# [[0, 1], [0, 2]]

a[0][0] = 1
print(a)
print(b)
# 深層受影響
# [[1, 1], [0, 2], [0, 3]]
# [[1, 1], [0, 2]]
# 深拷貝
import copy

a = [[0, 1], [0, 2]]
b = copy.deepcopy(a)

a.append([0, 3])
a[0][0] = 1

print(a)
print(b)
# 獨立不受影響
# [[1, 1], [0, 2], [0, 3]]
# [[0, 1], [0, 2]]

小補充

  • 個人經驗在超過 1 層,需要特別複製來做額外處理的,避免 bug,建議使用 deepcopy()
  • 當使用 dict 創造一個範本,值可能是 list 或是另一組 dict,複製範本後會處理各自的值,甚至交叉比對,請記得使用 deepcopy()

other

  • 是否存在: value in []
  • 是否不存在: value not in []
  • max()min():找出最大或最小值

參考資料

次回

來看看跟 list 相似的 tuple 以及另一種 set 吧!


上一篇
Python 微進階 Day04 - string(字串) - 2 - 長字串、格式化字串
下一篇
Python 微進階 Day06 - tuple(元組)、set(集合)
系列文
Python 微進階31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言