Почему список добавляет один и тот же элемент снова и снова? - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь решить эту проблему нахождения перестановки заданного списка, используя код ниже.Но список final продолжает добавлять одно и то же снова и снова.Он должен вернуть [[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]], но вместо этого он возвращает [[1,2,3],[1,2,3], [1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]].Я пытался исправить это некоторое время и буду очень признателен за вашу помощь.

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        self.final = []
        l = 0 
        r = len(nums) -1 
        self.permutation(nums, l, r)
        return self.final

    def permutation(self, nums, l, r):
        if l == r:
            self.final.append(nums)
            # print(nums)
            print(self.final)
        else:
            for i in range(r+1):
                nums[l], nums[i] = nums[i], nums[l]
                self.permutation(nums, l+1, r)
                nums[l], nums[i] = nums[i], nums[l]

A = Solution()
A.permute(['1','2','3'])

1 Ответ

0 голосов
/ 21 ноября 2018

вы меняете свой список на месте, вместо того, чтобы каждый раз создавать новый список.Ваш окончательный список содержит ссылки на тот же список в конце.

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

def permutation(self, nums, l, r):
    if l == r:
        self.final.append(nums.copy())
        # instead of self.final.append(nums)

примечание: itertools.permutations сделает эту работудля вас.

этот пост может помочь понять, что здесь происходит.

и, как уже упоминалось в комментарии: вы все еще не получаете все перестановки.это может работать для вас:

def permutation(self, nums, k):
    r = [[]]
    for i in range(k):
        r = [[a] + b for a in nums for b in r if a not in b]
    self.final = r
...