我正在构建一个演示任意维Vector
类来展示Python中的一些函数式编程。
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
的例子时,我觉得有一个类方法给我一个任意{{1}的向量的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)]
必须有更好的方法!如何以希望更简洁或Pythonic的功能风格重写此功能?
答案 0 :(得分: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]
哪个小更好。请记住,并非所有事情都必须是单行。
答案 1 :(得分:0)
下一个怎么样:
>>> def get_base(dimensions):
... for points in set(itertools.permutations([0] * (dimensions - 1) + [1], dimensions)):
... yield Vector(*points)