0

首先,我需要在 python 中使用 map 函数而不是理解来实现多处理

我的列表理解的初始版本如下

t3List = [x for x in rowCost if ( cost[t1][t2]+cost[rowCost.index(x)][tour[ tour.index(rowCost.index(x)) - 1 ] ]-cost[t2][rowCost.index(x)]-cost[t1][tour[ tour.index(rowCost.index(x)) - 1 ] ]>0 and rowCost.index(x) !=t1 and rowCost.index(x) != t2 and rowCost.index(x) != tour[ tour.index(t2)+1]  and x<cost[t1][t2] ) ]

为了更多的理解t1t2只是顶点。例如 , 的值t1分别t2为 34,21。 rowcost是一个列表,其中包含从一个顶点到每个其他顶点的距离。

tour只是我必须旅行的一些顶点顺序(基本上我正在解决 tsp )

这里所有的变量都是局部的。cost就像所有顶点的对称成本矩阵。

对于大量顶点,这个列表需要 0.5 到 1 秒来计算。所以我打算在看到这个后实现多处理

我知道 map 函数将第一个参数作为函数。

但是要实现上述理解,这个函数必须有多个参数,因为所有变量都是局部的。

如何解决这个问题呢?非常感谢任何帮助。

4

2 回答 2

1

试试这个代码:

def f(rowCost, x, cost, t1, t2, tour):
    if cost[t1][t2]+cost[rowCost.index(x)][tour[ tour.index(rowCost.index(x)) - 1 ] ]-cost[t2][rowCost.index(x)]-cost[t1][tour[ tour.index(rowCost.index(x)) - 1 ] ]>0 and rowCost.index(x) !=t1 and rowCost.index(x) != t2 and rowCost.index(x) != tour[ tour.index(t2)+1]  and x<cost[t1][t2]:
        return x
    else:
        return None

t3List = filter(None, map(f, rowCost))

我假设任何值rowCost都不能值None以减少map结果filter

于 2013-07-13T14:57:16.577 回答
0

我认为你想要的是 jabaldonedo 的答案,除了应该在其他地方定义f接受x, cost, t1, t2, tour这些值的函数,它应该只引用它们。即你的函数应该从一个有许多参数的函数“咖喱”成一个函数。

def f(rowCost):
    if <huge boolean expression>:
        return x
    else:
        return None
于 2013-07-13T15:21:14.180 回答