我以前在学校做过这个算法,但我忘记了怎么做。基本上我想返回一个字符串的结果,如'a [0]','a [0] .a [0]'...
length = range(0,2) #length = 2
depth = range(0,3) #depth = 3
for i in length:
for k in depth:
… print each permutation
RESULT
a[0]
a[0].a[0]
a[0].a[1]
a[0].a[0].a[0]
a[0].a[0].a[1]
a[0].a[1].a[0]
a[0].a[1].a[1]
a[1]
a[1].a[0]
a[1].a[1]
a[1].a[0].a[0]
a[1].a[0].a[1]
a[1].a[1].a[0]
a[1].a[1].a[1]
答案 0 :(得分:2)
改变输出的顺序,使其在所有级别上都相同:
def thing (length, depth, prefix = None):
if not depth: return
if not prefix: prefix = []
for l in range (length):
r = prefix + ['a[{}]'.format (l) ]
yield '.'.join (r)
for r in thing (length, depth - 1, r):
yield r
for x in thing (2, 3): print (x)
输出是:
a[0]
a[0].a[0]
a[0].a[0].a[0]
a[0].a[0].a[1]
a[0].a[1]
a[0].a[1].a[0]
a[0].a[1].a[1]
a[1]
a[1].a[0]
a[1].a[0].a[0]
a[1].a[0].a[1]
a[1].a[1]
a[1].a[1].a[0]
a[1].a[1].a[1]
答案 1 :(得分:1)
另一种方法;正如Hyperboreus指出的那样,关键是要意识到第一个元素的排序与以下元素的排序不匹配;所以我分开处理它们。
from itertools import product
def item_fmt(i):
return "a[{}]".format(repr(i))
def make_result(*args):
return ".".join(item_fmt(arg) for arg in args)
def main():
items = [0, 1]
maxdepth = 3
for first in items: # in order by first-item
print(make_result(first)) # show first-item-only
for depth in range(1, maxdepth): # in order by depth
for combo in product(items, repeat=depth): # generate all combinations of given depth
print(make_result(first, *combo))
if __name__=="__main__":
main()
结果
a[0]
a[0].a[0]
a[0].a[1]
a[0].a[0].a[0]
a[0].a[0].a[1]
a[0].a[1].a[0]
a[0].a[1].a[1]
a[1]
a[1].a[0]
a[1].a[1]
a[1].a[0].a[0]
a[1].a[0].a[1]
a[1].a[1].a[0]
a[1].a[1].a[1]