再探 List(串列)與字串操作
序列運算只有 + 、 *
-
- 串接 (Concatenation)
-
- 重複 (Repetition)
a = [1,3,4]+[4,6,7,8] # [1,3,4,4,6,7,8]
b = [0,2]*3 # [0,2,0,2,0,2]
b *= 2 # [0,2,0,2,0,2,0,2,0,2,0,2]
print(a)
print(b)
.append() / .pop()
.append(n) 插入數字 n
.pop(index) 把位置 index 的數字刪掉
a = [6, 7, 8]
a.append(9) # [6, 7, 8, 9]
a.pop(-2) # [6, 7, 9]
print(a) # [6, 7, 9]
-2 可以想成往前會循環到尾巴,所以 -2 是倒數第二個。
切片
list slicing 是指將 list 切出其中連續的一段,留意幾件事:
- 編號由 0 開始。
- 區間定義都是左閉右開(不含右端)。
- 負的編號是倒數,最後一個是-1。
- 第一個編號不寫代表開頭,第二個編號不寫表示一直到結尾都包含。
a = [0, 1, 2, 3, 4, 5]
b = a[1:3]
c = a[-3:-1]
d = a[:-2]
e = a[-4:]
print(a, b, c, d, e, sep="\n")
output:
[0, 1, 2, 3, 4, 5]
[1, 2]
[3, 4]
[0, 1, 2, 3]
[2, 3, 4, 5]
也可以對內容賦值, 甚至改變 list 的大小 。
a = [0, 1, 2, 3, 4, 5]
a[1:2] = [2,1]
print(a) # [0, 2, 1, 2, 3, 4, 5]
三個冒號的切片
a = [0,1,2,3,4,5]
a[ :4:2] # [0,2]
a[ : :3] # [0,3]
a[::-1] # [5,4,3,2,1,0] 這個很好用
a[ 2: :-1] # [2,1,0] 從 2 開始反向走到頭
list comprehension,以說明 List 內容的方式建構一個 list。相當於把 for 迴
圈內含在 list 建構中,可以雙迴圈,甚至可以加 if 條件式來過濾成員。
# [<要放進 list 的值> for <變數> in <範圍>]
a = [i**2 for i in range(6)]
print(a) # [0, 1, 4, 9, 16, 25]
# [<要放進 list 的值> for x in A for y in B if 條件]
b = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
print(b) # [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
字串:與 list 操作類似,相加是串接,乘整數是重複。
a = 'This is a Book.'
b = a + ' ' + 'I love Python.'
s = 'abc' * 3 # abcabcabc
s *= 2
for c in b[3: 8]: print(c)
d = '' # empty string
for x in b:
if x>='A' and x<='Z': d += x # b 中大寫字母擷取出來的字串
e = [ x for x in b if x>='a' and x<='z'] # list consisting char
字串與 list 一樣可以做 slice,但字串內容不可更改。
a = 'This is a Book.'
a[1] # h
a[1:6] # 'his i'
a[1] = 'x' # error
b = a[:4]+'PY'+a[6:]
c = a[::-1] # 反轉字串,記一下這用法
字串與 list 都可以用 in 檢查是否為元素的判斷式,但如果字串與串列很長時,可能
花費很多時間。注意字串可以檢查字元也可以檢查 子字串 。
這樣找的時間複雜度是 O(n)
a = [5, 4, 1, 7, 8]
if 3 in a: print('3 is in a')
else: print('3 is not in a')
4 in a # True
[5,4] in a # False
s = 'This is a book'
'T' in s # True
'b' in s # True
'S' in s # False
'is' in s # True
'The' in s # False