Python中的排列增长算法和打印字符串

时间:2014-02-19 20:15:51

标签: python algorithm permutation

我以前在学校做过这个算法,但我忘记了怎么做。基本上我想返回一个字符串的结果,如'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]

2 个答案:

答案 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]