【发布时间】:2013-10-07 21:31:09
【问题描述】:
我已经尝试寻找这个问题的答案并阅读了很多关于装饰器和全局变量的内容,但没有找到任何与手头的问题完全相关的东西:我想对 N- 进行所有排列长度使用A-alphabet、fxn(A,N)。我将传递函数 2 个参数:A 和 N。它将生成长度为N 的虚拟结果。然后,使用N 嵌套的for 循环,它将使用A 的每个元素从最内层循环开始更新结果的每个索引。所以fxn(‘01’,4) 会产生
1111, 1110, 1101, 1100, 1011, 1010, 1001, 1000,
0111, 0110, 0101, 0100, 0011, 0010, 0001, 0000
如果您知道需要多少个嵌套循环,这样做很简单(N;尽管超过 4 个它开始变得非常混乱和麻烦)。但是,如果您想使用 A 制作所有任意长度的序列,那么您需要一些方法来自动化这种循环行为。特别是,我还希望此函数充当生成器,以防止必须将所有这些值存储在内存中,例如使用列表。要开始它需要初始化第一个循环并使用单个值更改(要更新的索引)N-1 次来继续初始化嵌套循环。然后它将产生最内层循环的值。
fxn('01',4) 的直接方法是:
for i in alphabet:
tempresult[0] = i
for i in alphabet:
tempresult[1] = i
for i in alphabet:
tempresult[2] = i
for i in alphabet:
tempresult[3] = i
yield tempresult
基本上,我怎样才能将它扩展到任意长度的列表或字符串,并且仍然让每个嵌套循环更新适当的索引。我知道作为 numpy 的一部分可能有一个置换函数可以做到这一点,但我还没有遇到过。任何建议将不胜感激。
【问题讨论】:
-
你想要
itertools.permutations(),在标准库中——或者,更有可能的是itertools.product('01', repeat=4)。 -
实际上,我不认为
numpy有一个简单的方法可以做到这一点。您可以在每个递归步骤中使用结合tile和repeat的递归函数,但这似乎不是很简单或高效。