对于多维范围,是否有Python等效范围(n)?

Mai*_*tor 48 python iteration numpy range

在Python上,range(3)将返回[0,1,2].是否存在多维范围的等价物?

range((3,2)) # [(0,0),(0,1),(1,0),(1,1),(2,0),(2,1)]
Run Code Online (Sandbox Code Playgroud)

因此,例如,循环通过基于图块的游戏上的矩形区域的图块可以写为:

for x,y in range((3,2)):
Run Code Online (Sandbox Code Playgroud)

注意我不是要求实现.我想知道这是否是一个公认的模式,如果在Python或它的标准/公共库上有内置函数.

Joe*_*ton 63

在numpy,它是numpy.ndindex.另外看看numpy.ndenumerate.

例如

import numpy as np
for x, y in np.ndindex((3,2)):
    print x, y
Run Code Online (Sandbox Code Playgroud)

这会产生:

0 0
0 1
1 0
1 1
2 0
2 1
Run Code Online (Sandbox Code Playgroud)

  • +1:其语法与OP最初要求的语法惊人相似.打的好! (4认同)
  • 正如 Li-aung 指出的那样,这与我的要求惊人地相似,因此毫无疑问,这是该主题的最佳答案。 (2认同)
  • Li-aung Yip 的回答也很棒,并且对此有一些了解,因为它表明笛卡尔积可以用于相同的目的。 (2认同)

Li-*_*Yip 37

你可以使用itertools.product():

>>> import itertools
>>> for (i,j,k) in itertools.product(xrange(3),xrange(3),xrange(3)):
...     print i,j,k
Run Code Online (Sandbox Code Playgroud)

多次重复的xrange()陈述可以这样表达,如果你想将它扩展到一个十维循环或类似的荒谬:

>>> for combination in itertools.product( xrange(3), repeat=10 ):
...     print combination
Run Code Online (Sandbox Code Playgroud)

其中遍历10个变量,从不同的(0,0,0,0,0,0,0,0,0,0)(2,2,2,2,2,2,2,2,2,2).


一般来说,这itertools是一个非常棒的模块.同样,regexp比"普通"字符串方法更具表现力,itertools是表达复杂循环的一种非常优雅的方式.您应该自己阅读itertools模块文档.它会让你的生活更有趣.


dhg*_*dhg 22

实际上有一个简单的语法.你只需要两个fors:

>>> [(x,y) for x in range(3) for y in range(2)]
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
Run Code Online (Sandbox Code Playgroud)


0x9*_*x90 6

因此,这是两个列表的笛卡尔积:

import itertools
for element in itertools.product(range(3),range(2)):
    print element
Run Code Online (Sandbox Code Playgroud)

给出这个输出:

(0, 0)
(0, 1)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
Run Code Online (Sandbox Code Playgroud)