Python范围与元组,列表为imput

时间:2016-11-20 11:59:40

标签: python 3d range

有没有办法破解范围函数来接受元组?

像这样:

范围((0,0,0),(10,1,5),(1,1,1))

我想在自定义点类上使用范围,它可以返回列表,元组或类对象。我厌倦了for循环,而循环,生成器,列表推导,映射和过滤。它们在较小的数字<10时非常好,但是在较大的数字上它们需要太长时间。有没有办法可以做到这一点?

我打算用这个函数来描述空间,例如你有一些3d盒子的可用点,你需要检查一些其他的3D盒子,如果它可以位于某个点,带有更大的3d盒子,所以我会在这个例子中需要调用这个范围2次。一个:对于较大的3d框中的可用点,第二个检查较小的3d框中的每个点,如果它在较大的框中为空。因此,如果我有2分钟的范围功能,那么任何功能都需要4分钟+执行时间。现在这个项目必须规模更大,不仅仅是一个小盒子而是几个。

1 个答案:

答案 0 :(得分:0)

这是一个小的自定义范围功能,它基于zippingunpackingitertools.product

>>> from itertools import product
>>> from pprint import pprint

>>> def my_range(start, stop, step):
...     return product(*(xrange(*x) for x in zip(start, stop, step)))

>>> r = ((0, 0, 0), (5, 2, 4), (1, 1, 1))

>>> pprint(list(my_range(*r)))
[(0, 0, 0),
(0, 0, 1),
(0, 0, 2),
(0, 0, 3),
(0, 1, 0),
(0, 1, 1),
# ...
(4, 1, 1),
(4, 1, 2),
(4, 1, 3)]

但是,当性能变得很重要时,你应该考虑沿着Python3 range对象的方式实现你自己的范围类,因为这些点变得非常快,并且有更聪明的方法来检查是否包含一个盒子在另一个中,然后迭代所有点。