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

2024-04-29 20:24:19 发布

您现在位置: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)无效?你知道吗


Tags: lostringindexreturnifdefresulthi
2条回答

您正在原地修改ar,因此最终result包含同一对象的多个副本。将string_permute中的result.append(ar)更改为result.append(ar[:])解决了问题。你知道吗

您没有为数组对象创建副本。因此,每次尝试修改数组时,每次函数调用都会发生变化。你知道吗

每次执行递归调用时,为array对象创建一个副本。你知道吗

import copy

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

相关问题 更多 >