字符串排列。存储在数组中会返回相同的排列集吗?

时间:2016-06-01 07:50:45

标签: python

更新:请参阅以下行 除非我遗失了什么?

from array import array

def string_permute(ar, lo, hi, result):
    if lo == hi:
        # print ar # this gives correct permutated output, howcome result isn't able to store that?
        result.append(ar)
    else:
        for index in xrange(lo, hi+1):
            ar[index], ar[lo] = ar[lo], ar[index]
            string_permute(ar, lo+1, hi, result)
            ar[index], ar[lo] = ar[lo], ar[index]
    return result

if __name__ == "__main__":
    f = array('c', '1234')
    result = []
    string_permute(f, 0, len(f)-1, result)
    print result

输出:

[array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234')]

预期产出:

array('c', '1234') array('c', '1243') array('c', '1324') array('c', '1342') array('c', '1432') array('c', '1423') array('c', '2134') array('c', '2143') array('c', '2314') array('c', '2341') array('c', '2431') array('c', '2413') array('c', '3214') array('c', '3241') array('c', '3124') array('c', '3142') array('c', '3412') array('c', '3421') array('c', '4231') array('c', '4213') array('c', '4321') array('c', '4312') array('c', '4132') array('c', '4123')

我尝试传入result = result or [],然后进行

result += string_permute(ar, lo+1, hi, result)
return result #at the end of loop

但这也是适得其反的,并且输出相同。我不知道为什么。 这不是因为array我也只是用一个列表来尝试它。

如下面的其中一个答案中所述,我使用了一个列表。

def string_permute(ar, lo, hi, result):
    if lo == hi:
        result.append(ar[:])  #why does this work and result.append(ar) doesn't?
        print ar
    else:
        for index in xrange(lo, hi+1):
            ar[index], ar[lo] = ar[lo], ar[index]
            string_permute(ar, lo+1, hi, result)
            ar[index], ar[lo] = ar[lo], ar[index]
    return result

if __name__ == "__main__":
    f = array('c', '1234').tolist()  #just made it into a list
    result = []
    string_permute(f, 0, len(f)-1, result)
    print result

问:为什么这样做而且result.append(ar)没有?

2 个答案:

答案 0 :(得分:3)

您没有为数组对象制作副本。因此,每次尝试修改数组时,它都会针对每个函数调用进行更改。

每次进行递归调用时,请为数组对象创建一个副本。

import copy

string_permute(copy.copy(ar), lo+1, hi, result)

答案 1 :(得分:2)

您正在修改ar inplace,因此您最终会得到包含同一对象的多个副本的result。在result.append(ar)中将result.append(ar[:])更改为string_permute可解决问题。