我正在尝试写出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对象的。
如何有效地编写它以便我可以根据需要引用任何坐标?
答案 0 :(得分: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
答案 1 :(得分: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)]
当然,您可以使用itertools
等来整理生成坐标的方式,但我将这个答案集中在以后获得一种有效的方法来访问坐标。