iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
Software Development

跟著 OXXO 一起學 Python系列 第 22

( Day 11.2 ) Python 內建函式 ( 迭代物件操作 )

  • 分享至 

  • xImage
  •  

本篇教學會介紹「迭代物件操作」的內建函式,學會這些用法之後,對於串列、字典、tuple 或集合的操作,就能更加得心應手。

原文參考:內建函式 ( 迭代物件操作 )

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

常用操作方法

方法 參數 說明
range() start, stop, step 產生一個「整數序列」。
len() iter 取得串列、字典、集合、tuple 的長度。
map() func, iter 使用指定的函式,依序處理可迭代物件的每個項目,處理後產生一個全新的物件。
filter() func, iter 使用指定的函式,依序判斷可迭代物件的每個項目,將判斷結果為 Ture 的物件集合成為一個全新的物件。
sorted() x 將可迭代物件進行排序。
reversed() x 將有順序性的物件 ( 字串、串列和 tuple ) 內容反轉。
all() x 判斷一個可迭代物件裡,是否包含了 False 相關的元素。
any() x 判斷一個可迭代物件裡,是否包含了 True 相關的元素。
slice() start, stop, step 根據切片範圍,取出範圍內的項目,變成新的物件。
zip() 將指定的可迭代物件,打包變成一個新的物件。

range(start, stop, step)

range(start, stop, step) 可以產生一個「整數序列」,產生後可透過 list()、tuple() 之類的方法轉換成對應的類別。

參數 說明
start 起始數字
stop 結束數字 - 1
step 可不填,數字間隔,預設 1
a = range(1,5)
b = range(1,100,10)
c = range(5,-5,-1)
print(list(a))   # [1, 2, 3, 4]
print(list(b))   # [1, 11, 21, 31, 41, 51, 61, 71, 81, 91]
print(list(c))   # [5, 4, 3, 2, 1, 0, -1, -2, -3, -4]

range() 很常出現在一些迴圈的範例中,下方的例子,會印出 10 以內的奇數。

for i in range(1,10,2):
  print(i)   # 1 3 5 7 9

len(iter)

len(x) 可以取得串列、字典、集合、tuple 的長度 ( 有幾個項目 ),也可以取得字串的長度 ( 有幾個字母或數字 )

a = [1,2,3,4,5]
b = (1,2,3,4,5)
c = {'x','y','z'}
d = {'a':1,'b':2,'c':3,'d':4}
e = 'apple'
print(len(a))    # 5
print(len(b))    # 5
print(len(c))    # 3
print(len(d))    # 4
print(len(e))    # 5

map(function, iter)

map() 可以使用指定的函式,依序處理可迭代物件的每個項目,處理後產生一個全新的物件,下方的程式使用了同樣效果的具名函式 a 和匿名函式 lambda,將原本 [1,2,3,4,5] 串列裡每個項目都增加 1,最後轉換成串列和 tuple。

map() 會將第二個參數的可迭代物件,提供給第一個參數的函式作為引數使用。

def a(x):
    return x+1
b = map(a, [1,2,3,4,5])
c = map(lambda x: x+1, [1,2,3,4,5])

print(list(b))    # [2, 3, 4, 5, 6]
print(tuple(c))   # (2, 3, 4, 5, 6)

下方的例子,a 為一個文字串列,透過 map() 的方式可以快速的將 a 轉換為數字串列

a = ['1', '2', '3' ,'4', '5']
print(a)                # ['1', '2', '3' ,'4', '5']

b = list(map(int, a))   # 取出 a 的每個項目,套用 int(項目),組成新物件
print(b)                # [1, 2, 3, 4, 5]

因為 map 回傳的是一個可迭代物件,所以也可以將其賦值給變數,下方的例子,使用 map 將一個字串的串列內容,分別賦值給 a 和 b 兩個變數。

t = ['12', '34']
a, b = map(int, t)
print(a)    # 12
print(b)    # 34

filter(function, iter)

filter() 可以使用指定的函式,依序判斷可迭代物件的每個項目,將判斷結果為 Ture 的物件集合成為一個全新的物件,下方的程式使用了同樣效果的具名函式 a 和匿名函式 lambda,判斷 [1,2,3,4,5] 串列裡的每個項目,如果數值大於 2 就取出成為新物件,最後轉換成串列和 tuple。

def a(x):
  return x>2
b = filter(a, [1,2,3,4,5])
c = filter(lambda x: x>2, [1,2,3,4,5])

print(list(b))    # [3, 4, 5]
print(tuple(c))   # (3, 4, 5)

sorted(x, key=None, reverse=False)

sorted 可以將可迭代物件進行排序,並產生一個全新的物件

參數 說明
x 可迭代的物件,例如串列、字串、tuple、字典、集合
key 可不填,預設由第一個項目判斷 ( 如果有多層內容 ),也可指定判斷的項目
reverse 可不填,預設 False 由小到大,設定 True 表示由大到小
a = [1,5,3,4,2]
b = sorted(a)
c = sorted(a, reverse=True)

print(list(b))   # [1, 2, 3, 4, 5]
print(list(c))   # [5, 4, 3, 2, 1]

下方程式的 a 是一個二維的串列,使用 key 來讓排序以第二個項目做為依據,範例中使用具名函式 test 和 lambda 函式,都是一樣的效果 ( 參考:匿名函式 lambda )。

a = [[1,8],[2,1],[5,2],[3,5],[9,3]]
b = sorted(a, key=lambda x: x[1])

def test(x):
  return x[1]

c = sorted(a, key=test)

print(list(b))   # [[2, 1], [5, 2], [9, 3], [3, 5], [1, 8]]
print(list(c))   # [[2, 1], [5, 2], [9, 3], [3, 5], [1, 8]]

reversed(x)

reversed() 可以將有順序性的物件 ( 字串、串列和 tuple ) 內容反轉,產生一個全新的物件。

a = [1,2,3,4,5]
b = (1,2,3,4,5)
c = '12345'

print(list(reversed(a)))   # [5, 4, 3, 2, 1]
print(list(reversed(b)))   # [5, 4, 3, 2, 1]
print(list(reversed(c)))   # ['5', '4', '3', '2', '1']

all(x)

all() 可以判斷一個可迭代物件裡,是否包含了 False 相關的元素 ( 只要是 0、空白、False 都屬於 False 元素 ),如果包含就會回傳 False,反之不包含就會回傳 True,此外,如果是「空」的物件,會回傳 True。

a = [1,2,3,4,5]
b = [0,1,2,3,4,5]
c = ['x','y','z','']
d = []

print(all(a))    # True
print(all(b))    # False
print(all(c))    # False
print(all(d))    # True

any(x)

any() 可以判斷一個可迭代物件裡,是否包含了 True 相關的元素 ( 只要不是 0、空白、False 都屬於 True 元素 ),如果包含就會回傳 True,反之不包含就會回傳 False,此外,如果是「空」的物件,會回傳 False。

a = [1,2,3,4,5]
b = [0,1,2,3,4,5]
c = ['x','y','z','']
d = []

print(any(a))    # True
print(any(b))    # True
print(any(c))    # True
print(any(d))    # False

slice(start, stop, step)

slice(start, stop, step) 可以「定義切片範圍」,當指定的可迭代物件套用範圍後,就會取出範圍內的項目,變成新的物件。

參數 說明
start 起始數字
stop 結束數字 - 1
step 可不填,數字間隔,預設 1
a = slice(2,6)
b = slice(2,6,2)
c = [1,2,3,4,5,6,7,8,9]

d = c[a]
e = c[b]
print(d)      # [3, 4, 5, 6]
print(e)      # [3, 5]

zip()

zip() 可以將指定的可迭代物件,打包變成一個新的物件,新物件的長度與「最短」的一致,下方的例子將 a、b、c 三個列表打包,最後使用 list() 轉換成串列。

a = [1,2,3,4]
b = [5,6,7]
c = [8,9]
d = zip(a, b, c)
print(list(d))    # [(1, 5, 8), (2, 6, 9)]

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 11.1 ) Python 內建函式 ( 迭代物件轉換 )
下一篇
( Day 11.3 ) Python 生成式 ( 串列、字典、集合、元組 )
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言