【问题标题】:Naive permutation algorithm that python generator function doesn't supportpython生成器函数不支持的朴素置换算法
【发布时间】:2017-07-07 19:40:26
【问题描述】:

伙计们。 似乎我并不真正理解 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'))

【问题讨论】:

  • 您使用的是Python3.3或更高版本吗?

标签: python generator permutation


【解决方案1】:

当您递归调用gen_perm() 时,您不会对返回值做任何事情。

试试这个,如果yield from 在您的 Python 版本(3.3 及更高版本)中可用:

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))

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

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

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

【讨论】:

  • 可能值得注意的是,第一个 sn-p 适用于 Python 3.X,第二个适用于两个版本。
  • 谢谢,@JaredGoguen!
猜你喜欢
  • 2023-02-10
  • 2014-01-11
  • 2015-05-16
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
相关资源
最近更新 更多