python - 如何将索引传递给 map() 函数
问题描述
我有以下代码
x=0;y=0;mtrx=[[1,0,0,0,0,0],[0,1,0,1,1,1],[0,0,1,0,1,0],[1,1,0,0,1,0],[1,0,1,1,0,0],[1,0,0,0,0,1]];
def colmnFun(colmn):
column = colmn*5
return column
def rowFun(row):
row=list(map(colmnFun,row))
return row
result=list(map(rowFun,mtrx))
print(result)
在这种情况下,结果将是
[[5, 0, 0, 0, 0, 0], [0, 5, 0, 5, 5, 5], [0, 0, 5, 0, 5, 0], [5, 5, 0, 0, 5, 0], [5, 0, 5, 5, 0, 0], [5, 0, 0, 0, 0, 5]]
我需要根据 mtrx 索引在列函数中进行特定的数学运算,如何将索引传递给函数?
例如:
if x=1:
column = (colmn+2)*5
else if y=3:
column = colmn+1
解决方案
Map 确实将 iterables 作为参数,因此您可以使用 enumerate 将输入打包到元组中。要再次发送它,您必须使用部分将行索引附加到当前列函数
from functools import partial
mtrx = [[1,0,0,0,0,0],[0,1,0,1,1,1],[0,0,1,0,1,0],[1,1,0,0,1,0],[1,0,1,1,0,0],[1,0,0,0,0,1]]
def colmnFun(row_idx, column_data):
print(row_idx)
print(column_data)
col_idx, value = column_data
if col_idx == 1:
return (value + 2) * 5
if row_idx == 3:
return value + 1
return value
def rowFun(row_data):
row_idx, row = row_data
print(row)
row = list(map(partial(colmnFun, row_idx), enumerate(row)))
return row
result=list(map(rowFun, enumerate(mtrx)))
print(result)
结果:
[[1, 10, 0, 0, 0, 0], [0, 15, 0, 1, 1, 1], [0, 10, 1, 0, 1, 0], [2, 15, 1, 1, 2, 1], [1, 10, 1, 1, 0, 0], [1, 10, 0, 0, 0, 1]]
但是......我认为在这里使用numpy或使用 2 个循环对其进行简单迭代会容易得多,甚至可能将它们打包到嵌套列表理解中:
def do_math(row_idx, col_idx, value):
if col_idx == 1:
return (value + 2) * 5
if row_idx == 3:
return value + 1
return value
result = [
[
do_math(row_idx, col_idx, value)
for col_idx, value in enumerate(row)
]
for row_idx, row in enumerate(mtrx)
]
print(result)
这给出了相同的结果:
[[1, 10, 0, 0, 0, 0], [0, 15, 0, 1, 1, 1], [0, 10, 1, 0, 1, 0], [2, 15, 1, 1, 2, 1], [1, 10, 1, 1, 0, 0], [1, 10, 0, 0, 0, 1]]
推荐阅读
- css - 在移动设备和平板设备上禁用悬停
- python - 使用 imread 下载图像数据集时出错
- spring-boot - 如何在 Spring Boot 2.x 中使用 HttpSerletRequest?
- certbot - 如何查看 Certbot 制作的 SSL 证书中的所有域?
- php - PHP:调用时函数未运行,返回1
- javascript - Select2:通过vue js中的onclick事件加载后不起作用
- c# - 如何制作边界线
- javascript - 使用 jQuery 动态生成的文本框
- cron - Cron 作业将 Stdout/Stderr 重定向到日志文件和仅邮件 Stderr
- csv - QGIS:csv中的“添加分隔文本文件”忽略csvt文件中指定的精度