首页 > 解决方案 > 如何将索引传递给 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

标签: pythonlistdictionary

解决方案


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]]

推荐阅读