2015-01-10 2 views
0

두 벡터를 비교하고 싶습니다. a와 b가 있기 때문에 "무관심"해야하며, b는 지배 서로를 할 수없는 것으로 예상됩니다파레토 우세 벡터 선택

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 = [1,1,1] b = [1,1,2]와 같은 값의 경우 b가 a를 지배하기 때문에이 코드에는 아무런 문제가 없습니다. 결과적으로이 함수에서 "무관심"한 결과를 얻고 싶습니다. 어떻게받을 수 있습니까?

답변

3

두 개의 목록을 비교하려는 것 같습니다.. 이하 복귀 b는 달리 'indifferent'를 반환하는 경우 경우 a 모든 값이, 그 후, 새 창 ab에 대응하는 값보다 크거나 같다.

는이 같은 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] 

그리고 모든 값이 all를 사용하여 True을 경우 당신은 테스트 할 수 있습니다

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 배열에 있거나 배열이 큽니다. 또는 데이터를 배열 할 수있는 경우 'map (operator.ge, a, b) '를 여러 번 호출하는 대신 큰 배열에서'np.greater_equal' * once *를 호출하는 것과 같은 방식입니다. 따라서 답변은 특정 문제의 세부 사항에 달려 있습니다. – unutbu