python生成器函数不支持的朴素置换算法

时间:2017-07-07 19:40:27

标签: python generator permutation

人。 看起来我并不真正理解Python生成器函数的概念,因为我没有在这段代码中找出错误,该错误应该产生字符串字符的所有排列。

例如,这个基于简单的集合扩展,它可以工作

def permutations(seq):
    perm_set = set()

    def perm(cur_item_set, cur_str=''):
        if not cur_item_set:
            perm_set.add(cur_str)
        else:
            for item in cur_item_set:
                perm(cur_item_set - set(item), cur_str + item)

    perm(set(seq))

    for (i, item) in enumerate(perm_set):
        print(i + 1, item)

    permutations('abcdef')

同时,此代码不起作用:list(g)提供[]

def gen_perm(cur_item_set, cur_str=''):
    if not cur_item_set:
        yield cur_str
    else:
        for item in cur_item_set:
            gen_perm(cur_item_set - {item}, cur_str + item)

g = gen_perm(set('abcd'))

1 个答案:

答案 0 :(得分:2)

当您递归调用<s:iterator value="fieldErrors"> <s:property value="key"/>: <s:iterator value="value"> <s:property/> </s:iterator> </s:iterator> 时,您不会对返回值执行任何操作。

如果您的Python版本(3.3及更高版本)中有gen_perm(),请尝试此操作:

yield from

或者这适用于所有Python版本。

def gen_perm(cur_item_set, cur_str=''):
    if not cur_item_set:
        yield cur_str
    else:
        for item in cur_item_set:
            yield from gen_perm(cur_item_set - {item}, cur_str + item)

g = gen_perm(set('abcd'))
print (list(g))