2017-05-05 2 views
0

다음 코드를 매우 파이썬 적으로 작성할 수 있는지 궁금합니다. 코드가 단순화되었습니다. 시퀀스 또는 numpy 배열뿐만 아니라 각 입력에 대해 단일 값을 받아 들여야합니다. 문제는 단일 값에 len() 인수가 없다는 것입니다. 현재 유형이 numpy array 또는 list인지 확인하고 있습니다.값과 모든 종류의 반복 가능한 형식을 받아 들일 수있는 함수를 작성하십시오.

그러나 미래에 팬더 배열 또는 유사와 같이 반복 될 다양한 데이터 표현이있을 수 있습니다. 이렇게하면 코드의 변경이 더 빨라지고 if 문이 길어집니다.

입력이 반복 가능한지 여부를 확인할 수 있으면 코드가 미래에 동적이 될 수 있으므로 매우 유용 할 것입니다.

단순화 된 예제 코드 :

import numpy as np 


def test(a,b): 
    c = [] 
    if type(a) != type(b): 
     return None; 

    if type(a) is np.ndarray or type(a) is list: 
     for i in range(0,len(a)): 
      c.append(a[i] + b[i]) 
    else: 
     c = a + b 

    return c 

A = test(1,2) 
B = test([1,2,3],[1,2,3]) 
C = test(np.asarray([1,2,3]),np.asarray([1,2,3])) 

당신의 도움이

+0

당신이 NumPy와 함께 작업하는 경우는, 하나의 옵션은 np.asanyarray''으로 모든 입력을 래핑하는 단지이며, 다음은 스칼라, 목록에 대한 NumPy와 배열을 남겨, 및 배열은 – Eric

+0

당신이 줄 수 덜 고안된 예? 'B '타입이 어떤 것입니까? 그것은'list'이거나, np.ndarray 일 수 있습니까? – Eric

+0

이 코드에는 Pythonic이 아닌 다른 많은 것들이 있습니다. 예를 들어,'range (len (something)) '를 한번도 반복해서는 안됩니다. 귀하의 경우에는'zip (a, b)'를 사용해야합니다. 그러면 전체 블록이'c = [첫 번째에는 첫 번째, 두 번째에는 zip (a, b)] '될 수 있습니다. –

답변

1

두 요소가 __iter__ 방법이있는 경우 확인할 수 주셔서 감사합니다.

def test(a, b): 
    if not hasattr(a, '__iter__') and not hasattr(b, '__iter__'): 
     return a + b 
    return [x + y for x, y in zip(a, b)] # Let zip() raise the TypeError