哪个代码删除了排列中的重复组合

时间:2016-09-10 09:39:41

标签: python algorithm recursion

我没有发现下面两个函数之间的明显区别。所以问题是,第二个功能如何比较和删除重复的字符。

非重复字符的排列

def perms(s):        
    if(len(s)==1): return [s]
    result=[]
    for i,v in enumerate(s):
        result += [v+p for p in perms(s[:i]+s[i+1:])]
    return result
perms('abc')
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']

重复字符的排列

def permutations(string):
    result = set([string])
    if len(string) == 2:
        result.add(string[1] + string[0])
    elif len(string) > 2:
        for i, c in enumerate(string):
            for s in permutations(string[:i] + string[i + 1:]):
                result.add(c + s)
    return list(result)
permutations('aabb'); 
['aabb', 'abab', 'abba', 'baab', 'baba', 'bbaa']

修改

当输入包含重复项时,该函数返回不同的结果:

>>> permutations('aabb')
['abab', 'baba', 'bbaa', 'abba', 'aabb', 'baab']
>>> perms('aabb')
['aabb', 'aabb', 'abab', 'abba', 'abab', 'abba', 'aabb', 'aabb', 'abab',
'abba', 'abab', 'abba', 'baab', 'baba', 'baab', 'baba', 'bbaa', 'bbaa', 
'baab', 'baba', 'baab', 'baba', 'bbaa', 'bbaa']

1 个答案:

答案 0 :(得分:2)

区别很简单。第二个函数将结果存储在集合中:

result = set([string])

一组永远不会包含重复项。如果您向集合添加重复值,请注意:

>>> set([1, 2, 3, 2, 3, 2, 1])
set([1, 2, 3])

最后,该函数从集合中创建一个列表,因此从外部看不到该集合:

return list(result)