2012-03-20 47 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 

必须有一个更好的办法!我如何以希望更简洁或Pythonic功能风格重写此函数?

回答

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] 

这是一个更好。请记住,并非所有事情都必须是一揽子的。