python:递归扩展列表理解

时间:2018-04-13 14:56:14

标签: 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 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)])]

(为简单起见,我没有在范围内使用反向)。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

有人最近提出了一个非常相似的问题:"[How to] determine all combinations of flipping a coin without using itertools.product?"我为此提供了答案。我不认为它是重复的,因为我相信itertools.product最适合您的特定问题。

然而,你可能想知道 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接受 iterables 的列表,因此可以在产品中使用任何可迭代的输入。它们甚至可以如此处所示混合

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

product实现的其他特性在my answer中讨论了我所关联的问题。如果你有兴趣看看如何在没有发电机的情况下做到这一点,我也提供了一个纯粹的功能解决方案。