[Python, 的, list, 教學 ]

星期二 09 Apr 2019   even  
教學

我們上一回已經介紹了最基本的數值運算,現在來教另一個python最基本的類型,list。

在python的世界裡,如果要把多個物件放在一起,必須使用容器類型的物件,其中最常見的就是本篇要介紹的list。

以中括號表示list,裡面的物件以逗號區隔,可以放入任意數量任意類型的物件。

要確認list內有幾個物件,可以使用len()。

a = [1, 2, 3] #list內放入三個整數
print(len(a))
b = [1, 0.8, '你好', True] # list內放入整數、浮點數、字串、布林值
print(len(b))

c = [[1, 2], [3, 4]] # list內有兩個清單類型的物件
print(c)
print(len(c))

3
4
[[1, 2], [3, 4]]
2

如果想要獲得list內各自位置的數值,需使用list的index,python的index從0開始,也就是如果要取得上面例子中,a的第一個物件,需要使用index 0。

也可以使用倒數的,倒數第一個物件的index為-1。

依此類推,如下:

a = [1, 2, 3]
b = [1, 0.8, '你好', True]

print(a[0]) # a的第一個物件
print(b[2]) # b的第三個物件
print(b[-2]) # b的倒數第二個物件
print(b[-1]) # b的最後一個物件

1
你好
你好
True

Bonus Tip

List屬於python中最常使用的可迭代物(iterable),可以讓程式依序執行的都為iterable,能夠放入for迴圈使用。除了list外,常用的iterable還包含,dict、集合set、tuple、range、generator等。在後續的教學中再一一介紹。

如果要把其他類型的iterable轉成list,可以直接使用list()。

如下:

a = {1, 2, 3, 4, 1}
print(a)
print(type(a))

a = list(a)
print(a)
print(type(a))

a = range(10)
print(a)
print(type(a))

a = list(a)
print(a)
print(type(a))

[1, 2, 3, 4, 5]
{1, 2, 3, 4}
<class 'set'>
[1, 2, 3, 4]
<class 'list'>
range(0, 10)
<class 'range'>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<class 'list'>

list的切割

可以使用list的index和符號 : ,切出較短的list,使用範例如以下程式碼。

a = list(range(20)) # 快速生出包含0~19整數的list
print(a)
print(a[5:]) # 切出 5 <= index
print(a[:5]) # 切出 index <= 5
print(a[3:10]) # 切出包含 3 <= index < 10的物件
print(a[3:-2]) # 切出包含 3 <= index < len(a)-2 的物件

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4]
[3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]

除了上面的方式外,也有進階的用法,每隔幾個物件的切法以及以相反的順序切。

a = list(range(20))
print(a[::5]) # 從頭到尾,每隔五個切出來
print(a[2:10:2]) # 從2 <= index < 10中,每隔2個切出來
print(a[::-1]) # 從尾到頭,也就是清單內物件的順序完全反過來
print(a[::-5]) # 從尾到頭,每隔五個切出來
print(a[10:2:-1]) # 以相反的順序,將2 < index <= 10的物件切出來
print(a[10:2:-2]) # 以相反的順序,從2 < index <= 10中,每隔2個切出來
print(a[2:10:-2]) # 這樣會切不出東西喔

[0, 5, 10, 15]
[2, 4, 6, 8]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[19, 14, 9, 4]
[10, 9, 8, 7, 6, 5, 4, 3]
[10, 8, 6, 4]
[]

更新你的list

一旦你創造了你的list後,你可以以多種方式變更其中的內容,可以新增、插入、刪除物件,如以下的清單方法(method):

python的各類別物件有所對應到的專屬的方法(method),使用 . 來表示,例如,當你將A指派成清單類型的物件時,你就可以使用list的方法,如˙: A.pop(),關於方法的部分會留到class的教學時再進行介紹。

方法 功能 參數說明
list.append(x) list的最末端多添加一個物件 任意物件
list.extend(iterable) 延伸list iterable
list.insert(i,x) 在index i 的位置插入x i: index, x: 任意物件
list.remove(x) list中刪除數值為x的第一個物件 x為任意物件,但若x不在list中則會報錯
list.pop(i) list中刪除index為i的物件 i 默認為最後一個物件
list.clear() 將list清空 無參數
list.sort(key=None, reverse=False) 將list依規則重新排列 key: 排列規則, reverse: 是否反向

另外,如果只是想修改某個位置的內容的話,可以直接指定。

使用範例如下:

a = list(range(10))
print(a)
a[5] = -100 # 將a的第六個物件的內容改為-100
print(a)

a.append(999)
print(a)
a.insert(3,'你好')
print(a)
a.remove('你好')
print(a)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, -100, 6, 7, 8, 9]
[0, 1, 2, 3, 4, -100, 6, 7, 8, 9, 999]
[0, 1, 2, '你好', 3, 4, -100, 6, 7, 8, 9, 999]
[0, 1, 2, 3, 4, -100, 6, 7, 8, 9, 999]

a = list(range(10))
print(a)
a.pop()
print(a)
a.pop(3)
print(a)


a = [3, 1, 2, 4, 5]
print(a)
a.sort()
print(a)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 4, 5, 6, 7, 8]
[3, 1, 2, 4, 5]
[1, 2, 3, 4, 5]

其他常用list功能

A = [1, 2, 3]
B = ['你好', '我好', '大家好']

C = A + B # 等同於A.extend(B),因此其實我從來沒用過extend
print(C)

print(B * 3) # 等同於 B + B + B,非常直觀

print('你好' in B) # '你好'是不是在B裡面呢?

print(max(A)) # A的最大值
print(min(A))
print(max(C)) # 因為C裡面有非數值類的物件,因此會報錯

[1, 2, 3, '你好', '我好', '大家好']
['你好', '我好', '大家好', '你好', '我好', '大家好', '你好', '我好', '大家好']
True
3
1
Traceback (most recent call last):

File "<ipython-input-4-dde2e6938532>", line 13, in <module>
print(max(C)) # 因為C裡面有非數值類的物件,因此會報錯

TypeError: '>' not supported between instances of 'str' and 'int'

list的複製或複寫?

使用 = 來指派某個新的變數為list時,並非複製出一份新的list,而是讓這個變數等同於這個list,因此會有以下的狀況:

a = [1,2,3,4]
b = a
a.pop(2)
print(b)

[1, 2, 4]

在上面的例子中,a的第三個物件被移掉了,同時b也一樣,因為b就是a,隨著a的改變,b的內容被複寫掉了!!

有時候這不是你要的,你需要的是一份剛好內容一模一樣的新的list,這時候就必須使用list.copy。

如下:

a = [1,2,3,4]
b = a.copy()
a.pop(2)
print(b)

[1, 2, 3, 4]

使用時要確認好哪種方式是你要的喔~

總結

以上就是python的list基本操作,雖然有點多但這些都是實際編寫編寫python程式碼時會一再使用到的,所以,試著記起來吧~

只要多使用幾次,就很容易地記起來了~

在接下來的新手教學中,也有很多內容是必須先搞懂list才能開始的,包含字串、for迴圈、list comprehension這些python的基本操作,也因此list是python的基礎中的基礎,總之,就是這樣啦。

感謝您閱讀到這裡,祝您有美好的一天~

我們下回見啦~

python新手教學
Why python
Hello Python!
This is a python - 基本數值運算與邏輯判斷
[Python, 的, list, 教學 ]
"python的字串教學"
python的迴圈與流程控制
python的(tuple)與{dict}
def 一個python的自訂函數:
import套件到你的python
python的嘗試try與錯誤error處理
Python之禪

相關文章:

>