在 Python 中将嵌套 for 循环转换为 map 等效项

pythonserver side programmingprogramming

一般来说,for 循环用于执行/迭代代码块固定次数。而嵌套 for 循环只不过是迭代代码块 x 次,然后我们需要在该代码中运行另一个代码块 y 次。

嵌套 for 循环语法

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

map 是 Python 中的一个内置函数,用于迭代序列中的项,并在对这些项应用函数后生成结果。

语法

map(function, iterable)

其中,

  • function:此函数将应用于 iterable 的项。

  • iterable:一个序列对象,如列表、集合、元组等,

在本文中,我们将看到 Python 程序将嵌套 for 循环转换为等效的 map。

示例

让我们以嵌套 for 循环为例,更改二维数组元素的数据类型。然后,将 map 转换为 for 循环的等效项。

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("嵌套 for 循环输出",a)

# 创建与上述代码等效的映射
a = [['2.3','.2'],['-6.3','0.9']]
print("输入:", a)
result = [list(map(float, subarr)) for subarr in a]
print("转换后的映射等效输出:",result)

输出

输入:[['2.3', '.2'], ['-6.3', '0.9']]
嵌套 for 循环输出 [[2.3, 0.2], [-6.3, 0.9]]
输入:[['2.3', '.2'], ['-6.3', '0.9']]
转换后的映射等效输出:[[2.3, 0.2], [-6.3, 0.9]]

我们可以在上面的代码块中看到嵌套 for 循环和 map 等效代码及其结果。这里,我们将二维数组元素的数据类型从字符串更改为浮点数。

使用列表推导和 map() 函数,我们将嵌套 for 循环转换为 map 等效。

示例

解决上述问题的另一种方法是利用 lambda 运算符将浮点数映射到子列表。并使用 map() 函数两次迭代列表和子列表元素来替换列表推导。

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

result = list(map(lambda b : list(map(float, b)), a))
print("转换后的 Map 等效输出:",result)

输出

输入:[['2.3', '.2'], ['-6.3', '0.9']]
转换后的 Map 等效输出:[[2.3, 0.2], [-6.3, 0.9]]

示例

让我们举一个例子,使用嵌套 for 循环和 map() 查找范围内所有素数的列表函数。

# Python 程序查找范围内所有素数的列表

lower = 2
upper = 30
prime_numbers = []

for num in range(lower, upper + 1):
   # 所有素数都大于 1
   if num > 1:
      for i in range(2, num):
         if (num % i) == 0:
               break
      else:
         prime_numbers.append(num)

print("使用嵌套 for 循环的素数列表:")
print(prime_numbers)

# 使用 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("使用 Map 等同于嵌套 for 循环的素数列表:")
print(map_resul)

输出

使用嵌套 for 循环的素数列表:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
使用 Map 等同于嵌套 for 循环的素数列表:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

我们可以看到嵌套 for 循环和 map 等效代码,用于查找给定范围内的所有素数列表。

map 等效代码是通过使用带有 if else 块和过滤函数的 lambda 实现的。

示例

在此示例中,我们将编写嵌套 for 循环和 map 等效代码来添加循环元素的 2 个整数。

forloop_result = []
for a in range(1,5):
   for b in range(1,6):
      forloop_result.append(a+b)
print("嵌套 for 循环输出", forloop_result)

from itertools import product
result = list(map(lambda x: sum(x) , product(range(1,5), range(1,6))))
print("转换后的 Map 等效输出:",result)

输出

嵌套 for 循环输出 [2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9]
转换后的 Map 等效输出:[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)]


相关文章