Код не возвращает перестановок - PullRequest
0 голосов
/ 29 мая 2018

Я написал код Python для перестановки списка чисел.

class Solution:

    def __init__(self):
        self.permutations = []

    def permute_helper(self, nums, chosen):

        if nums == []:
            print chosen
            self.permutations.append(chosen)
        else:
            for num in nums:
                #choose
                chosen.append(num)
                temp = nums[:]
                temp.remove(num)

                #explore
                self.permute_helper(temp, chosen)

                #un-choose
                chosen.remove(num)

    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        self.permute_helper(nums, [])
        return self.permutations

s = Solution()
input = [1,2,3]
print s.permute(input)

Возвращает:

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
[[], [], [], [], [], []]

Я хочу, чтобы все перестановки отображались в возвращаемом списке следующим образом

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

Я думаю, что это как-то связано с областью видимости, но я понятия не имею, что я сделал неправильно, чтобы список ничего не возвращал.

1 Ответ

0 голосов
/ 29 мая 2018

Когда вы добавляете chosen к self.permutations, любое изменение, которое вы вносите в chosen после факта, также влияет на каждый элемент self.permutations.Позвонив chosen.remove позже, вы также удалите номера из self.permutations.Рассмотрим этот более простой пример:

>>> a = [1,2,3]
>>> b = []
>>> b.append(a)
>>> b.append(a)
>>> b.append(a)
>>> a.remove(2)
>>> b
[[1, 3], [1, 3], [1, 3]]

Вместо этого можно добавить поверхностную копию chosen к self.permutations, и в этом случае изменения, внесенные в chosen, впоследствии не будут влиять на self.permutations.

    if nums == []:
        print chosen
        self.permutations.append(chosen[:])

Результат:

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...