2015-01-10 91 views
0

我想比较两个矢量。该矢量表示两种可供选择:选择帕累托显性矢量

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主导了a。因此,我想从这个函数中获得“无差别”的回报。我怎样才能得到?

回答

3

它看起来像你想比较两个名单元素。如果所有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] 

而且你可以测试是否所有的值用allTrue

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' 
+0

根据应用程序,你可能需要对名单是相等的情况。 – zch

+0

@unutbu,这是比较两个向量之间优势的最快方法吗? – Rodolphe

+0

我不能告诉你什么是最快的,但在某些情况下,使用NumPy的'np.greater_equal'可能会更快 - 特别是如果数据已经在NumPy数组中,数组很大,或者如果您可以将数据安排在这种方式可以在大数组上调用'np.greater_equal' *一次,而不是多次调用'map(operator.ge,a,b)'。所以答案很大程度上取决于你的特定问题的细节。 – unutbu