將巢狀 for 迴圈轉換為 Python 中等效的 map 函式


通常,for 迴圈用於執行/迭代一段程式碼固定的次數。而巢狀 for 迴圈就是,迭代一段程式碼 x 次,然後我們需要在該程式碼中再執行另一段程式碼 y 次。

巢狀 for 迴圈語法

for x in sequence:
   for y in sequence:
      inner loop
   outer loop

map 是 Python 中一個內建函式,用於迭代序列的專案,並在對這些專案應用函式後生成結果。

語法

map(function, iterable)

其中,

  • function:此函式將應用於可迭代物件的專案。

  • iterable:一個序列物件,例如列表、集合、元組等。

在本文中,我們將瞭解 Python 程式如何將巢狀 for 迴圈轉換為等效的 map 函式。

示例

讓我們以一個巢狀 for 迴圈示例來更改二維陣列元素的資料型別。然後,將 for 迴圈轉換為等效的 map 函式。

a = [['2.3','.2'],['-6.3','0.9']]
print("Input:", a)
for j in range(2):
    for i in range(2):
        a[i][j] = float(a[i][j])
print("Nested for-loop output",a)

# Create a map equivalent to the above code
a = [['2.3','.2'],['-6.3','0.9']]
print("Input:", a)
result = [list(map(float, subarr)) for subarr in a]
print("Converted Map equivalent output:",result)

輸出

Input: [['2.3', '.2'], ['-6.3', '0.9']]
Nested for-loop output [[2.3, 0.2], [-6.3, 0.9]]
Input: [['2.3', '.2'], ['-6.3', '0.9']]
Converted Map equivalent output: [[2.3, 0.2], [-6.3, 0.9]]

在上面的程式碼塊中,我們可以看到巢狀 for 迴圈和等效的 map 函式程式碼及其結果。在這裡,我們將二維陣列元素的資料型別從字串更改為浮點數。

使用列表推導式和 map() 函式,我們將巢狀 for 迴圈轉換為等效的 map 函式。

示例

此處,另一種解決上述問題的方法將利用 lambda 運算子將 float 對映到子列表。並且使用 map() 函式兩次迭代列表和子列表元素,替換了列表推導式。

a = [['2.3','.2'],['-6.3','0.9']]
print("Input:", a)

result = list(map(lambda b : list(map(float, b)), a))
print("Converted Map equivalent output:",result)

輸出

Input: [['2.3', '.2'], ['-6.3', '0.9']]
Converted Map equivalent output: [[2.3, 0.2], [-6.3, 0.9]]

示例

讓我們以一個示例來查詢給定範圍內所有素數的列表,使用巢狀 for 迴圈和 map() 函式。

# Python program to find list of all the prime numbers within a range

lower = 2
upper = 30
prime_numbers = []

for num in range(lower, upper + 1):
   # all prime numbers are greater than 1
   if num > 1:
      for i in range(2, num):
         if (num % i) == 0:
               break
      else:
         prime_numbers.append(num)

print("List of prime numbers using Nested for-loop:")
print(prime_numbers)

# find list of prime numbers using map
map_resul = list(filter(None, list(map(lambda i: i if all(i%j != 0 for j in range(2, int(i ** 0.5) + 1)) else None , range(lower, upper + 1)))))
print("List of prime numbers using Map equivalent to the nestesd for-loop:")
print(map_resul)

輸出

List of prime numbers using Nested for-loop:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
List of prime numbers using Map equivalent to the nestesd for-loop:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

我們可以看到巢狀 for 迴圈和等效的 map 函式程式碼,用於查詢給定範圍內的所有素數列表。

等效的 map 函式程式碼是透過使用帶有 if else 塊和 filter 函式的 lambda 實現的。

示例

在這個示例中,我們將編寫巢狀 for 迴圈和等效的 map 函式程式碼來新增迴圈元素的 2 個整數。

forloop_result = []
for a in range(1,5):
   for b in range(1,6):
      forloop_result.append(a+b)
print("Nested for-loop output", forloop_result)

from itertools import product
result = list(map(lambda x: sum(x) , product(range(1,5), range(1,6))))
print("Converted Map equivalent output:",result)

輸出

Nested for-loop output [2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9]
Converted Map equivalent output: [2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9]

此處,執行了 itertools 模組中的 product() 方法用於獲取輸入可迭代物件的笛卡爾積。如下所示,

[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5)]

更新於: 2023年5月30日

601 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.