2

我正在尝试写出 3d 对象的坐标,但我不确定如何列出它。

到目前为止,我有:

class threed:
    def __init__(self,length,width,height):
        self.h =height
        self.l = length
        self.w = width
        self.f=0
        self.lwh = (length,width,height)

for i in range(1,3):
      for j in range(1,3):
           for k in range(1,3):
                coordinates=threed(i,j,k)

问题是我的函数每次都会重写变量坐标,因此我永远无法访问坐标 (1,1,1)。

请注意,以上是针对 2x2x2 对象的。

如何有效地编写它以便我可以根据需要引用任何坐标?

4

2 回答 2

5

你可以做:

[threed(*x) for x in itertools.product(range(1, 3), range(1,3), range(1,3))]

拥有每个对象。您也可以使用 3 个for循环:

[threed(x, y, z) for x in range(1, 3) for y in range(1,3) for z in range(1,3)]

__repr__方法添加到您的类中,您可以更轻松地看到结果。

def __repr__(self):
    return 'threed' + repr(self.lwh)

所以第一个代码的输出将是:

[threed(1, 1, 1), threed(1, 1, 2), threed(1, 2, 1), threed(1, 2, 2), 
 threed(2, 1, 1), threed(2, 1, 2), threed(2, 2, 1), threed(2, 2, 2)]

要允许threed比较对象,您可以添加一个__eq__方法:

def __eq__(self, other):
    return self.lwh == other.lwh
于 2012-07-30T01:41:12.407 回答
1

之后coordinates=threed(i,j,k)可以将坐标添加到字典中,以便以后高效访问。

就像是:

obj3d = dict()
for i in range(1,3):
      for j in range(1,3):
           for k in range(1,3):
                key = (i, j, k)
                obj3d[key] = threed(*key)

然后你有一obj3d本字典,可以做:

  any_threed = obj3d[(1,1,1)]

当然,您可以使用itertoolsetc. 来整理生成坐标的方式,但我将这个答案集中在获得稍后访问坐标的有效方法上。

于 2012-07-30T02:00:48.593 回答