Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:递归扩展列表理解_Python_List_Recursion_List Comprehension - Fatal编程技术网

python:递归扩展列表理解

python:递归扩展列表理解,python,list,recursion,list-comprehension,Python,List,Recursion,List Comprehension,我一直在四处寻找,我没有找到我的具体问题的答案。使我的问题具体化的是,我试图只使用列表理解。 问题: 使用以下代码: [print(k,l,m) for k in range(3) for l in range(2) for m in range(1)] 我得到输出: 0 0 0 0 1 0 1 0 0 1 1 0 2 0 0 2 1 0 这适用于n=3或任何硬编码的n。然而,我想做的是: [print(k1,k2,...,kn) for k1 in range(n) for k2 in r

我一直在四处寻找,我没有找到我的具体问题的答案。使我的问题具体化的是,我试图只使用列表理解。

问题:

使用以下代码:

[print(k,l,m) for k in range(3) for l in range(2) for m in range(1)]
我得到输出:

0 0 0
0 1 0
1 0 0
1 1 0
2 0 0
2 1 0
这适用于n=3或任何硬编码的n。然而,我想做的是:

[print(k1,k2,...,kn) for k1 in range(n) for k2 in range(n-1) .. for kn in range(1)].
我希望有人能马上看到答案——谢谢

编辑 解决方案发布在下面,但为了明确我希望的格式,下面是我如何使用它打印编码元组的:

n=3
[print(x) for x in itertools.product(*[list(range(i)) for i in range(n,0,-1)])]

(为了简单起见,没有在范围上使用reverse)。

如果允许您:

n=3
list(itertools.product(*[list(range(i)) for i in reversed(range(1, n+1))]))

如果允许,您可以使用itertools.product:

n=3
list(itertools.product(*[list(range(i)) for i in reversed(range(1, n+1))]))

最近有人问了一个非常类似的问题:对此我给出了答案。我不认为它是一个复制品,因为我相信<代码>迭代工具。产品< /代码>最适合您的特定问题。

但是,您可能想知道
itertools.product
是如何实现这一点的。或者,您可能希望在递归扩展中编码不同的转换。下面,我将分享一个使用Python生成器的可能解决方案

def product (*iters):
  def loop (prod, first = [], *rest):
    if not rest:
      for x in first:
        yield prod + (x,)
    else:
      for x in first:
        yield from loop (prod + (x,), *rest)
  yield from loop ((), *iters)

for prod in product ("ab", "xyz"):
  print (prod)

# ('a', 'x')
# ('a', 'y')
# ('a', 'z')
# ('b', 'x')
# ('b', 'y')
# ('b', 'z')
因为
product
接受一个iterable列表,所以任何iterable输入都可以在产品中使用。如图所示,它们甚至可以混合

print (list (product (['@', '%'], range (2), "xy")))
# [ ('@', 0, 'x')
# , ('@', 0, 'y')
# , ('@', 1, 'x')
# , ('@', 1, 'y')
# , ('%', 0, 'x')
# , ('%', 0, 'y')
# , ('%', 1, 'x')
# , ('%', 1, 'y')
# ]
我们可以制作一个程序
foo
,提供您问题中发布的输出

def foo (n):
  def build_ranges (m):
    if m == 0:
      return []
    else:
      return [ range (m) ] + build_ranges (m - 1)
  yield from product (*build_ranges (n))


for prod in foo (3):
  print (prod)

# (0, 0, 0)
# (0, 1, 0)
# (1, 0, 0)
# (1, 1, 0)
# (2, 0, 0)
# (2, 1, 0)
或者使用解构分配为产品的各个元素创建绑定

for (x,y,z) in foo (3):
  print ("x", x, "y", y, "z", z)

# x 0 y 0 z 0
# x 0 y 1 z 0
# x 1 y 0 z 0
# x 1 y 1 z 0
# x 2 y 0 z 0
# x 2 y 1 z 0

产品
实现的其他品质将在我链接的问题中讨论。如果您有兴趣了解如何在没有发电机的情况下实现这一点,我也提供了一个纯功能性的问题解决方案。

最近有人问了一个非常类似的问题:我提供了答案。我不认为它是一个复制品,因为我相信<代码>迭代工具。产品< /代码>最适合您的特定问题。

但是,您可能想知道
itertools.product
是如何实现这一点的。或者,您可能希望在递归扩展中编码不同的转换。下面,我将分享一个使用Python生成器的可能解决方案

def product (*iters):
  def loop (prod, first = [], *rest):
    if not rest:
      for x in first:
        yield prod + (x,)
    else:
      for x in first:
        yield from loop (prod + (x,), *rest)
  yield from loop ((), *iters)

for prod in product ("ab", "xyz"):
  print (prod)

# ('a', 'x')
# ('a', 'y')
# ('a', 'z')
# ('b', 'x')
# ('b', 'y')
# ('b', 'z')
因为
product
接受一个iterable列表,所以任何iterable输入都可以在产品中使用。如图所示,它们甚至可以混合

print (list (product (['@', '%'], range (2), "xy")))
# [ ('@', 0, 'x')
# , ('@', 0, 'y')
# , ('@', 1, 'x')
# , ('@', 1, 'y')
# , ('%', 0, 'x')
# , ('%', 0, 'y')
# , ('%', 1, 'x')
# , ('%', 1, 'y')
# ]
我们可以制作一个程序
foo
,提供您问题中发布的输出

def foo (n):
  def build_ranges (m):
    if m == 0:
      return []
    else:
      return [ range (m) ] + build_ranges (m - 1)
  yield from product (*build_ranges (n))


for prod in foo (3):
  print (prod)

# (0, 0, 0)
# (0, 1, 0)
# (1, 0, 0)
# (1, 1, 0)
# (2, 0, 0)
# (2, 1, 0)
或者使用解构分配为产品的各个元素创建绑定

for (x,y,z) in foo (3):
  print ("x", x, "y", y, "z", z)

# x 0 y 0 z 0
# x 0 y 1 z 0
# x 1 y 0 z 0
# x 1 y 1 z 0
# x 2 y 0 z 0
# x 2 y 1 z 0

产品
实现的其他品质将在我链接的问题中讨论。如果您有兴趣了解如何在没有生成器的情况下实现这一点,我还提供了一个纯功能性的问题解决方案。

您的输出与您希望看到的有什么不同?请提供所需的报价output@bcr我举了一个n=3的例子,但我想对任何非硬编码的n都能做到这一点……那么列表压缩就不是办法了。“仅列表理解”是什么意思?您使用了
print
range
,它们不是列表理解。是否允许我在解决方案中使用
itertools.product
?我可以在列表中定义递归lambda函数吗?在列表理解中做任何事情都有什么意义呢?如果你从中得到了一些东西,那么应该知道这不是列表理解应该做的事情。其实并没有“通过列表理解变得更好”这样的事情。99%的列表理解应该是简单的。复杂的列表理解应该是普通的循环或一堆较小的列表理解。您的输出与您希望看到的有什么不同?请提供所需的报价output@bcr我举了一个n=3的例子,但我想对任何非硬编码的n都能做到这一点……那么列表压缩就不是办法了。“仅列表理解”是什么意思?您使用了
print
range
,它们不是列表理解。是否允许我在解决方案中使用
itertools.product
?我可以在列表中定义递归lambda函数吗?在列表理解中做任何事情都有什么意义呢?如果你从中得到了一些东西,那么应该知道这不是列表理解应该做的事情。其实并没有“通过列表理解变得更好”这样的事情。99%的列表理解应该是简单的。复杂的列表理解应该是普通的循环或一堆较小的列表理解。好吧,这会产生正确的整数组合,但是颠倒过来,并且与问题中的代码顺序不同。太好了!肯定朝着正确的方向前进。我还尝试使用itertools,添加了一个条件(我修改了代码以正确的顺序工作;)如果将范围稍微调大一点,我们就可以得到正确的顺序:list(itertools.product(*[list(range(i))表示范围(n,0,-1)])中的i)。好的,这会生成正确的整数组合,但是颠倒过来,并且与问题中的代码顺序不同。太好了!肯定朝着正确的方向前进。我还尝试使用itertools,添加了一个条件(我修改了代码以正确的顺序工作;)如果将范围稍微调高一点,我们可以得到正确的顺序:list(itertools.product(*[list(range(i))表示范围(n,0,-1)]中的i)