iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 5
1
Software Development

從零開始學Python系列 第 5

[Day 05] 從零開始學Python - 串列(list)、Tuple(元組)、字典(dict)、集合(set):我的字典裡沒有放棄,因為我還沒有寫進去(上)

註:本文同步刊載在Medium,若習慣Medium的話亦可去那邊看呦!

先來解答昨天的問題吧!
1. 答案如下:

>>> chs='abcdefghijklmnopqrstuvwxyz'
>>> print(chs[::-2])  # 從尾往頭,step為-2,不要忘記沒有寫的還是要補冒號!
zxvtrpnljhfdb
>>> print(chs[16]+chs[14]*2+' '+'有種果汁真好喝~') # 對吧XD
qoo 有種果汁真好喝~

2. 已經知道bin的前兩位表示是0b,那麼利用slice取第二位以後即可。

>>> bin(36)
'0b100100'
>>> print(bin(36)[2:])
100100

3. 只要按照順序就可以接起來囉!

>>> a, b, c = 'pen', 'apple', 'pine'
>>> print(a+c+b*2+a) # PPAP
penpineappleapplepen

接下來,讓我們介紹幾個比較進階的資料型態:
串列(list)、tuple(元組)、字典(dict)、集合(set)

首先是串列和tuple,
由於Tuple的稱呼(元組)翻法實在相對比較少人愛用,
因此習慣上tuple就直接叫做tuple就可以了。
你說到底要念做「禿波」(too-pull)還是「他波」(tub-pull)呢?
Guido自己講說他都隨便念沒有關系,
不過我是都念咖死口啦!

我們先講串列的部分,
所謂的串列,就是一連串的元素(單一的資料)放進一個表裡面的東西。
這個表可以沒有任何元素,也可以有很多個元素,其數量是可以被改變的。
要做出一個串列,可以使用list(),或者一組中括號[]來表示,
當然,也可以在當中用逗號分隔每個元素並在開始時直接置入:

>>> lt = []
>>> llt = list()
>>> lt, llt # 兩個都是空的串列
([], [])
>>> lt = ['my', 'dict', 'doesn\'t', 'have', 'the', 'word', 'giving', 'up.', 9527, True] # 一個串列裡的元素彼此不一定非得要是同樣的資料型態,這點跟C++/Java等不同
>>> print(lt)
['my', 'dict', "doesn't", 'have', 'the', 'word', 'giving', 'up.', 9527, True]
>>> ' '.join(lt) # 上一篇提到說使用join可以將串列連接,但必須要全都是字串
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 8: expected str instance, int found
>>> ' '.join(lt[:-2]) # 串列同樣可以用slice,用法和字串的邏輯一樣,所以倒數2個被去掉後就能正常join了!
"my dict doesn't have the word giving up."
>>> (' '.join(lt[:-2])).split() # 使用split可以將字串拆成串列
['my', 'dict', "doesn't", 'have', 'the', 'word', 'giving', 'up.']
>>> list('apple pen') # 直接對字串使用list()方法,會將每個字元拆開來變成一個串列
['a', 'p', 'p', 'l', 'e', ' ', 'p', 'e', 'n']
>>> lt[3] # 單獨給定索引值(index),就會得到對應位置的資料(別忘了是從0開始呦!)
'have'
>>> lt[-2]
9527
>>> lt[0]
'my'
>>> lt[100] # 但是不論用正數表達或負數表達,超過的部分都不會繞一圈回來,而是會顯示錯誤
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> lt[::-1] # 同樣的,利用slice可以輕鬆做到將整個list反轉過來
[True, 9527, 'up.', 'giving', 'word', 'the', 'have', "doesn't", 'dict', 'my']
>>> lt[2] = '0800' # 指定index可以對list的對應的元素做更動
>>> lt
['my', 'dict', '0800', 'have', 'the', 'word', 'giving', 'up.', 9527, True]

接著,留意到串列中的元素既然沒有限定,那麼元素可以是另一個串列嗎?
當然可以!

>>> lt3 = [[1, 2], [3, 4, 5], [6, 7, 9, 0], 'X', 'D'] # 有些元素是串列,有些只是單一的字元
>>> lt3[0], lt3[1], lt3[2][3], lt3[3], lt3[4] # 第二層的話就加括號和對應的index
([1, 2], [3, 4, 5], 0, 'X', 'D')
>>> lt3[4][1] # 當取得的是str時,按照規則取字串的字元,超出的話會顯示錯誤
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> lt3[0][2] # 當取得的是list時,超出取得的list的範圍的index也會顯示錯誤
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

接下來是串列常見的一些操作,請務必多加熟練,
我們先簡單敘述一下常見的操作:(以下請將lt開頭的東西當成是list)
lt.append(element) -> 將element接到lt的尾巴
lt.extend(lt2) -> 將lt2的所有elements依序接到lt的尾巴 (相當於lt+=lt2)。
lt.insert(index, element) -> 在index處插入element(原本該位置及其後的元素都往後挪)。
del lt[index] -> 將index處的element刪去,其他element往前遞補
lt.remove(name) -> 從lt中搜尋符合name的element,將其刪去,其他element往前遞補
lt.index(name) -> 從lt中搜尋符合name的element,並將其索引值回報
xx in lt -> 如果xx這個元素在lt中的話則為True,否則為Flase。
lt.count(name) -> 計算name在lt出現的次數
lt.join(sep) -> 使用join內的間隔sep,將lt的元素一個一個接起來
lt2 = sorted(lt) -> 將lt排序過後(按元素的順序由小到大),存放到lt2。(lt不會受改變)
lt.sort() -> 將lt於原地排序。
len(lt) -> 取得lt的元素個數。(想成取長度也行)
lt2 = lt.copy()
lt3 = list(lt) -> lt2~lt4都代表複製lt的所有元素產生新的list
lt4 = lt[:]

>>> lt = [1, 3, 5]
>>> lt.append(15) # 附加一個元素到尾端
>>> lt
[1, 3, 5, 15]
>>> lt.extend([3,9, -1]) # 附加一組元素到尾端(如果這個用append的話,會將[3, 9, -1]直接當成單一元素放入)
>>> lt
[1, 3, 5, 15, 3, 9, -1]
>>> lt.insert(3, 2) # 先選位置,再給插入值
>>> lt
[1, 3, 5, 2, 15, 3, 9, -1]
>>> del lt[1] # 砍掉index位置的値,後面遞補
>>> lt
[1, 5, 2, 15, 3, 9, -1]
>>> lt.remove(3) # 砍掉對應的值的元素(找不到的話會出錯)
>>> lt
[1, 5, 2, 15, 9, -1]
>>> lt.index(9) # 找對應的値在串列的索引值
4
>>> 9 in lt # 在喊在
True
>>> 3 in lt # 不在喊不在
False
>>> lt.extend([-3, -1, 2, -1, -2]) 
>>> lt
[1, 5, 2, 15, 9, -1, -3, -1, 2, -1, -2]
>>> lt.count(-1) # 計算元素出現次數
3
>>> lt.count(-2)
1
>>> lt.count(2)
2
>>> lt.sort() # 原地排序
>>> lt
[-3, -2, -1, -1, -1, 1, 2, 2, 5, 9, 15]
>>> lt.extend([3, 9, -2])
>>> lt2 = sorted(lt) # 另行排序,排完放到lt2,lt不會被改變
>>> lt2
[-3, -2, -2, -1, -1, -1, 1, 2, 2, 3, 5, 9, 9, 15]
>>> len(lt2) # 取長
14

蠻多的對吧?
盡量不要死記硬背,嘗試多練習不同的操作變化看看呦!

接下來介紹tuple(元組),
tuple可以說是固定版的串列,
一旦決定以後,它本身裡面的元素就無法被單獨修改了!
要使用tuple,我們會用小括號(),當中是空白或用逗號分隔的元素。
要留意的是,無論除非你直接將變數名稱整個指定成別的內容,
否則是無法用像tpl[1] = 'edit'這樣的東西去修改的!
除此以外,我們也可以用多重指派的方式來讓每個元素接取到tuple或list的元素。

>>> tpl = (1, 3, 'XD', '9', 123)
>>> tpl
(1, 3, 'XD', '9', 123)
>>> tpl[1]
3
>>> tpl[1] = 100
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> a, b, c, d, e = tpl # 對應五個元素,左右兩邊互相對到即可,這種方式也稱為tuple開箱(unpacking)
>>> a
1
>>> b
3
>>> c
'XD'
>>> d
'9'
>>> e
123

由於不能修改的特性,前面提到list的append/extend等方法tuple都沒有;
但是tuple有幾點好處:

  1. 占用空間較少
  2. tuple的元素不會不小心被動到
    除此之外,tuple後續也可以做為字典的輸入使用,這點下一篇文章會提到。
    其他還有一些特別的特性,之後有機會再提吧!

我們在下半段將介紹另外兩種資料型態:字典(dict)及集合(set)。

那就明天見啦!


上一篇
[Day 04] 從零開始學Python - 型態轉換及字串基礎:叫你印出來不是叫你開印表機阿!
下一篇
[Day 06] 從零開始學Python - 串列(list)、Tuple(元組)、字典(dict)、集合(set):我的字典裡沒有放棄,因為我還沒有寫進去(下)
系列文
從零開始學Python30

尚未有邦友留言

立即登入留言