2017-07-07 75 views
1

伙计。 看来我并不真正理解Python生成器函数的概念,因为我没有想到在这个代码中应该产生字符串的所有排列的错误。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')) 
+0

你使用Python3.3或更高版本? –

回答

2

当递归调用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)) 
+0

值得明确指出的是,第一个代码片段适用于Python 3.X,第二个代码片段适用于这两个版本。 –

+0

谢谢,@JaredGoguen! –

+0

@Robᵩ,谢谢,现在我可以用这个东西 –

相关问题