2017-05-05 6 views
0

次のコードを非常にpyononicな方法で書くことができるのだろうかと思います。 コードが簡素化されています。それは、各入力に単一の値だけでなく、シーケンスまたはnumpy配列を受け入れる必要があります。問題は、単一の値にlen()引数がないことです。現在、タイプがnumpy arraylistかどうかを確認しています。値と任意の種類の反復可能な型を受け入れることができる関数を書く

しかし、将来、パンダアレイや類似のように、繰り返されるデータ表現が異なる可能性があります。これにより、コードの変更と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])) 

は、両方の要素が__iter__メソッドを持っているかどうかをチェックすることができ、あなたの助け

+0

あなたがnumpyので作業している場合には、一つの選択肢はnp.asanyarray' 'ですべての入力をラップするだけで、その後、あなたは、スカラー、リストのnumpyの配列が残っている、と配列は – Eric

+0

あなたが与えることができますそれほど人為的な例はありませんか?あなたは 'B '型が気になりますか?それは 'list'でなければならないか、' np.ndarray'でもかまいませんか? – Eric

+0

このコードには、Python以外のものがたくさんあります。例えば、 'range(len(something))'を反復処理しないでください。あなたの場合は、 'zip(a、b)'を使うべきです。ブロック全体が 'c = [最初のものは1番目、2番目はzip(a、b)]'になります。 –

答えて

1

いただきありがとうございます。

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 
関連する問題