我试过寻找这个问题的答案,并阅读了很多关于装饰器和全局变量的内容,但是没有发现任何与手头问题完全有意义的东西:我想做{{1}的每个排列} -length使用N
- 字母,A
。我将传递函数2参数:fxn(A,N)
和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
,那么直接执行此操作;虽然超过4但它开始变得非常麻烦和繁琐)。但是,如果要使用A生成所有任意长度的序列,则需要某种方法来自动执行此循环行为。特别是我还希望这个函数充当生成器,以防止必须将所有这些值存储在内存中,例如使用列表。要启动它,需要初始化第一个循环并使用单个值更改(要更新的索引)N
次来初始化嵌套循环。然后它将产生最内层循环的值。
执行N-1
的简单方法是:
fxn('01',4)
基本上,我如何将其扩展为任意长度列表或字符串,并仍然获得每个嵌套循环以更新适当的索引。我知道可能有一个排列函数作为numpy的一部分来做这件事,但我还没有遇到过。任何建议将不胜感激。
答案 0 :(得分:3)
你实际上并不想要这里的排列,而是alphabet*alphabet*alphabet*alphabet
的笛卡尔积。你可以写成:
itertools.product(alphabet, repeat=4)
或者,如果你想获得字符串而不是元组:
map(''.join, itertools.product(alphabet, repeat=4))
(在2.x中,如果你想让它返回一个惰性迭代器而不是一个列表,就像原始代码一样,使用itertools.imap
而不是map
。)
如果你想用numpy做这个,我能想到的最好的方法是使用一个递归函数,为每个因子平铺和重复,但this answer有一个更好的实现,你可以从那里复制,或显然从scikit-learn
退出sklearn.utils.extmath.cartesian
,然后执行此操作:
cartesian([alphabet]*4)
当然,它会为您提供一个包含一位数字字符串的2D数组;你还需要再做一步,将它压平成一维N位数字的数组,而numpy会减慢你的速度,而不是在产品计算中加速你,所以......除非你真的需要一个numpy数组,我还是d坚持使用itertools
。
答案 1 :(得分:0)
您可以查看itertools.permutations
功能的工作原理。