Python 3.x 具有固定范围的循环的嵌套数目可变

Python 3.x 具有固定范围的循环的嵌套数目可变,python-3.x,recursion,Python 3.x,Recursion,我正在寻找一种方法,它具有可变数量的嵌套for循环,而不是下面的代码。例如,如果变量n表示嵌套For循环的数量,并且n=3,则我的代码是: p = [] for i in range(26): for j in range(26): for k in range(26): p.append([i,j,k]) p = [] for i in range(26): for j in range(26): p.append([i,j]) 相反,如果n=2我的代码

我正在寻找一种方法,它具有可变数量的嵌套for循环,而不是下面的代码。例如,如果变量n表示嵌套For循环的数量,并且n=3,则我的代码是:

p = []
for i in range(26):
  for j in range(26):
    for k in range(26):
      p.append([i,j,k])
p = []
for i in range(26):
  for j in range(26):
    p.append([i,j])
相反,如果n=2我的代码是:

p = []
for i in range(26):
  for j in range(26):
    for k in range(26):
      p.append([i,j,k])
p = []
for i in range(26):
  for j in range(26):
    p.append([i,j])

我知道使用递归可以做到这一点,但对于如何做到这一点,我有点困惑。

类似的方法应该可以:

import itertools

n=3
fixed=26
p = list(itertools.product(range(fixed), repeat=n))
此解决方案使用了
itertools
的优化功能,因此速度应该相当快


请注意,
itertools.product
返回一个迭代器,因此需要对其进行转换以获得一个数组。

类似的操作应该可以:

import itertools

n=3
fixed=26
p = list(itertools.product(range(fixed), repeat=n))
此解决方案使用了
itertools
的优化功能,因此速度应该相当快


请注意,
itertools.product
返回一个迭代器,因此需要对其进行转换以获得一个数组。

对于一个人来说,发展推理这些问题的技能非常重要。在本例中,Python包括
itertools.product
,但下次需要编写特定于程序的行为时会发生什么?还会有另一个神奇的内置功能吗?也许其他人会发布第三方库来解决您的问题

下面,我们将
product
设计为一个简单的递归函数,它接受一个或多个列表

def product (first, *rest):
  if not rest:
    for x in first:
      yield (x,)
  else:
    for p in product (*rest):
      for x in first:
        yield (x, *p)

for p in product (range(2), range(2), range(2)):
  print ('x: %d, y: %d z: %d' % p)

# x: 0, y: 0 z: 0
# x: 1, y: 0 z: 0
# x: 0, y: 1 z: 0
# x: 1, y: 1 z: 0
# x: 0, y: 0 z: 1
# x: 1, y: 0 z: 1
# x: 0, y: 1 z: 1
# x: 1, y: 1 z: 1
假设您想要一个更传统的迭代排序,您可以通过使用辅助的
循环
助手来完成

def product (first, *rest):
  def loop (acc, first, *rest):
    if not rest:
      for x in first:
        yield (*acc, x)
    else:
      for x in first:
        yield from loop ((*acc, x), *rest)
  return loop ((), first, *rest)

for p in product (range(2), range(2), range(2)):
  print ('x: %d, y: %d z: %d' % p)

# x: 0, y: 0 z: 0
# x: 0, y: 0 z: 1
# x: 0, y: 1 z: 0
# x: 0, y: 1 z: 1
# x: 1, y: 0 z: 0
# x: 1, y: 0 z: 1
# x: 1, y: 1 z: 0
# x: 1, y: 1 z: 1

对一个人来说,培养思考这些问题的技能是很重要的。在本例中,Python包括
itertools.product
,但下次需要编写特定于程序的行为时会发生什么?还会有另一个神奇的内置功能吗?也许其他人会发布第三方库来解决您的问题

下面,我们将
product
设计为一个简单的递归函数,它接受一个或多个列表

def product (first, *rest):
  if not rest:
    for x in first:
      yield (x,)
  else:
    for p in product (*rest):
      for x in first:
        yield (x, *p)

for p in product (range(2), range(2), range(2)):
  print ('x: %d, y: %d z: %d' % p)

# x: 0, y: 0 z: 0
# x: 1, y: 0 z: 0
# x: 0, y: 1 z: 0
# x: 1, y: 1 z: 0
# x: 0, y: 0 z: 1
# x: 1, y: 0 z: 1
# x: 0, y: 1 z: 1
# x: 1, y: 1 z: 1
假设您想要一个更传统的迭代排序,您可以通过使用辅助的
循环
助手来完成

def product (first, *rest):
  def loop (acc, first, *rest):
    if not rest:
      for x in first:
        yield (*acc, x)
    else:
      for x in first:
        yield from loop ((*acc, x), *rest)
  return loop ((), first, *rest)

for p in product (range(2), range(2), range(2)):
  print ('x: %d, y: %d z: %d' % p)

# x: 0, y: 0 z: 0
# x: 0, y: 0 z: 1
# x: 0, y: 1 z: 0
# x: 0, y: 1 z: 1
# x: 1, y: 0 z: 0
# x: 1, y: 0 z: 1
# x: 1, y: 1 z: 0
# x: 1, y: 1 z: 1

您可以用
列表(iterable)
替换
[x代表iterable中的x]
您可以用
列表(iterable)
替换
[x代表iterable中的x]