簡體   English   中英

python:遞歸擴展列表理解

[英]python: recursive expanding 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)])]

(為簡單起見,沒有在范圍上使用反向)。

如果允許您使用itertools.product:

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

最近有人問一個非常相似的問題: “ [如何]在不使用itertools.product情況下確定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接受可迭代列表,所以任何可迭代輸入都可以在產品中使用。 它們甚至可以按此處所示進行混合

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實施的其他質量。 如果您有興趣了解如何在不使用生成器的情況下執行此操作,那么我也將提供該問題的純功能解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM