2012-03-20 9 views
2

私はデモ用の任意の次元のVectorクラスを作成して、Pythonでいくつかの関数型プログラミングを示します。n次元「単位行列」を生成する方法は?

class Vector(): 
    def __init__(self, *coords): 
    self.coords = coords 
    def __add__(this, that): 
    return Point(*[(x+y) for x,y in zip(this.coords, that.coords)]) 
    #... 

この例では、静的@classmethodの例を思い付くしようとしますが、私は私にどんなnのためのベクターのn次元の基底を与えるクラスのメソッドがあると便利だろうことを決めました。それは次のとおりです。

>>> Vector.get_base(dimensions = 2) 
[Vector(1,0), Vector(0,1)] 
>>> Vector.get_base(3) 
[Vector(1,0,0), Vector(0,1,0), Vector(0,0,1)] 
>>> Vector.get_base(1) 
[Vector(1)] 

私はしかし、しかし、巨大な脳のおならを抱えていると、「適切に」これらのリストを生成する方法の問題につまずいています。

def get_base(dimensions): 
    arrays = [] 
    zeros = [0] * dimensions 
    for i in range(dimensions): 
    item = zeros 
    item[i] = 1 
    arrays.append(Vector(*array)) 
    return arrays 

もっと良い方法がなければならない:私が今まで考えることができますどのような

は、宣言型のソリューションです!どのようにして、この関数をうまくいってもっと簡潔なPythonの関数形式で書き直すことができますか?

次についてどのように

答えて

0

>>> def get_base(dimensions): 
...  for points in set(itertools.permutations([0] * (dimensions - 1) + [1], dimensions)): 
...    yield Vector(*points) 
1

さて、あなたはこれを行うことができます:

def get_base(dimensions): 
    return [Vector(*coords) for coords in 
     [[(0,1)[i==j] for i in range(dimensions)] for j in range(dimensions)]] 

を私は少しそれを打破します:

ある
def get_base(dimensions): 
    arrays = [[(0,1)[i==j] for i in range(dimensions)] for j in range(dimensions)] 
    return [Vector(*coords) for coords in arrays] 

少し良い。すべてがワンライナーでなければならないことを覚えておいてください。

関連する問題