2013-12-24 6 views
0

매개 변수 검색 함수를 작성하여 매개 변수 중 하나를 반복하고 반복적으로 다른 모든 매개 변수가 같은 함수를 호출하려고합니다. 나는 두 노동자가 있고 그들은 내가 search()에 전달하는 model 플래그의 값에 따라이라고파이썬의 그리드 검색 함수

def worker1(a, b, c): 
    return a + b + c 


def worker2(d, e, f): 
    return d * e * f 


def search(model, params): 
    res = [] 

    # Loop over one of the parameters and repeatedly append to res 
    if model == 1: 
     res.append(worker1(**params)) 
    elif model == 2: 
     res.append(worker2(**params)) 

    return res 

params = dict(a=1, b=2, c=3) 
print search(1, params) 

: 여기에 몇 가지 예제 코드입니다. 여기에서 해결하려고하는 문제는 매개 변수 중 하나만 변경하여 worker1라고 반복적으로 호출하는 if 문에 루프 (코드에 주석 처리됨)를 작성하는 것입니다. 내 코드가 융통성을 갖길 원합니다. 가끔 a을 반복하고 bc을 동일하게 유지하려고하지만 때로는 b을 반복하고 ac을 동일하게 유지하려고합니다.

나는 해결책이 무엇이든 공개적으로 열려 있지만 검색 매개 변수를 params 사전에 지정한다고 생각합니다. 예 : 1,2,3,4 돌이 a에, 내가 말할 것이다 : 나는 worker1worker2에 대한 코드를 수정할 필요가 없습니다 경우

`params = dict(a=[1,2,3,4], b=2, c=3)` 

이 또한 좋을 것이다.

감사합니다.

답변

2

itertools.product PARAMS의 모든 조합으로 노동자를 호출 :
http://docs.python.org/2/library/itertools.html#itertools.product

예를 들면 훨씬 이해가되지 것입니다 귀하의 작업자 기능은 다른 이름의 인수를 취할으로 나는 키워드 인수를 사용하여 피했다

from itertools import product 

def worker1(a, b, c): 
    return a + b + c 

def worker2(d, e, f): 
    return d * e * f 

def search(model, *params): 
    res = [] 

    # Loop over one of the parameters and repeatedly append to res 
    for current_params in product(*params): 
     if model == 1: 
      res.append(worker1(*current_params)) 
     elif model == 2: 
      res.append(worker2(*current_params)) 

    return res 

print search(1, [1,2,3,4], [2], [3]) 

# more complicated combinations are possible: 
print search(1, [1,2,3,4], [2,7,9], [3,13,23,43]) 

.

당신의 작업자 기능이 위의 코드처럼 보이지 않는다고 가정한다면 sumreduce 기능을 사용하여 코드를 더 단순화 할 수 있다고 생각합니다.

1

문제를 이해할 수 있을지 잘 모르겠습니다. 이 당신이 원하는 있는지 확인합니다 (model 매개 변수를 생략) :

>>> def worker1(a, b, c): 
     return a + b + c 

>>> def search(params): 
     params = params.values() 
     var_param = filter(lambda p: type(p) == list, params)[0] 
     other_params = filter(lambda p: p != var_param, params) 
     return [worker1(x, *other_params) for x in var_param] 

>>> search({'a':2, 'b':[3,4,5], 'c':3}) 
[8, 9, 10] 

가 가정 : worker1()

  • 인수는 교환 법칙이 성립됩니다 (순서는 중요하지 않습니다).
  • 가변 매개 변수는 list
  • 이며 다른 매개 변수는 단일 값입니다. 위의 샘플 b에서

당신이 돌이하려는 변수 매개 변수입니다

업데이트 : 함수 worker1의 인수의 경우 위해서는

보존 할 수 있습니다 :

def search(params): 
    params = params.items() 
    var_param = filter(lambda t: type(t[1]) == list, params)[0] 
    other_params = filter(lambda t: t != var_param, params) 
    var_param_key = var_param[0] 
    var_param_values = var_param[1] 
    return [worker1(**dict([(var_param_key, x)] + other_params)) for x in var_param_values]