动态调用函数

时间:2016-10-21 19:28:12

标签: python arrays function

我的数组可能是3X3或5X3或7X3,让我们假设以下数组:

1      1.1     1
0.9    .8      0.99
0.9    0.7     0.7
1      1       1
0.7    .5      .9
0.9    0.95    0.8
1      1       1

在每一行中我想找到最大值,如果最大值是我要调用的第一个元素function1,如果最大值在第二位,我想调用function2,如果最大值是在第三位,我想打电话给function3.

每行重复相同的程序。

我怎么能在python中做到这一点?

3 个答案:

答案 0 :(得分:1)

好吧,找到最大元素的索引非常简单:

maxindex = max(range(len(row)), key=row.__getitem__)

您可以预定义一个简单的tuple映射到三个函数:

functions = (function1, function2, function3)

将它们组合在一起,您可以将最大计算,查找和调用单行化为:

functions[max(range(len(row)), key=row.__getitem__)]()

把它放在一个循环中,你就完成了:

for row in myarray:
    functions[max(range(len(row)), key=row.__getitem__)]()

答案 1 :(得分:0)

matrix = [
           [1, 1.1, 1],
           [0.9, .8, 0.99],
           [0.9, 0.7, 0.7],
           [1, 1, 1],
           [0.7, .5, .9],
           [0.9, 0.95, 0.8],
           [1, 1, 1]
         ]

for row in matrix:
    (f1,f2,f3)[row.index(max(row))](row)

如果你想从中创建一个新列表,你也可以使用一行:

newlist=[(f1,f2,f3)[row.index(max(row))](row) for row in matrix]

答案 2 :(得分:0)

如果您使用numpy,使用np.argmax会变得非常简单 - 这是一个非常直接的脚本来帮助说明用法:

import numpy as np
arr = np.array([
    [1,    1.1,    1],
    [0.9,    .8,   0.99],
    [0.9,    0.7,    0.7],
    [1,    1,    1],
    [0.7,    .5,   .9],
    [0.9 ,   0.95,    0.8],
    [1,    1,    1]])


def func0(row):
    print(0, row)
def func1(row):
    print(1, row)
def func2(row):
    print(2, row)

funcs = [func0, func1, func2]
for ix, row in zip(np.argmax(arr, axis=1), arr):
    funcs[ix](row)

请注意,argmax(arr, axis=1)将返回值为012的数组。这些值表示最大值行中的索引。我们可以zip数组本身的最大值来同时获取索引和行。剩下要做的唯一事情是将索引映射到要调用的函数,然后使用row作为输入调用函数。我使用了list,但您可以轻松使用dict

如果更容易避免zip,您可以这样写:

for row in arr:
    funcs[np.argmax(row)](row)

这样,您一次只能处理1行。这类似于solution posted by ShadowRanger,使用argmax来挑选最大索引可以使解决方案更加精简(以第三方导入为代价)。