选择Pareto-Dominant向量

时间:2015-01-10 20:02:03

标签: python optimization

我想比较两个向量。这个向量代表两种选择:

def select_dominant(a,b):
    comp=a>b
    if(comp):
        return a
    elif(a<b):
        return b
    else:
        return "indifferent"

a=[1,10,1]
b=[1,1,10]
print(select_dominant(a,b))

预计a和b应该“无关紧要”,因为a和b不能支配彼此。对于像a = [1,1,1] b = [1,1,2]这样的值,这个代码没有问题,因为b占主导地位。 因此,我希望从这个功能得到“无动于衷”的回报。我怎么能得到?

1 个答案:

答案 0 :(得分:4)

看起来您想要比较两个列表 elementwise 。如果全部 a中的值大于或等于b中的对应值 返回a,如果小于或等于返回b,则返回'indifferent'

您可以将>=运算符应用于ab的每个元素,如下所示:

In [247]: a = [1,10,1]

In [248]: b = [1,1,10]

In [249]: map(operator.ge, a, b)
Out[249]: [True, True, False]

您可以使用True测试所有值是否为all

In [250]: all(map(operator.ge, a, b))
Out[250]: False

因此,如果你定义:

import operator
def select_dominant(a,b):
    ge = all(map(operator.ge, a, b))
    le = all(map(operator.le, a, b))
    return a if ge else b if le else 'indifferent'

然后

In [242]: select_dominant([1,1,1], [1,1,2])
Out[242]: [1, 1, 2]

In [243]: select_dominant([1,1,2], [1,1,1])
Out[243]: [1, 1, 2]

In [244]: select_dominant([1,10,1], [1,1,10])
Out[244]: 'indifferent'

表达式

a if ge else b if le else 'indifferent'

是所谓的conditional expression。 这是生成与此代码分配给value的相同值的简便方法:

if ge:
    value = a
elif le:
    value = b
else:
    value = 'indifferent'