我正在处理有关leetcode的问题:
给出一组不同的整数,返回所有可能的排列。
如果我反复打印结果,我会得到正确的值。一旦将其添加到列表中,结果将不正确。发生什么事了?
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if len(nums) == 1:
return nums
permutations = list()
import math
max_swaps = math.factorial(len(nums))
pair = [0,1]
for i in range(max_swaps):
if pair[1] == len(nums):
pair[0] = 0
pair[1] = 1
p = self.swap(nums, pair[0], pair[1])
print("Adding %s to the list" % p)
permutations.append(p)
pair[0] += 1
pair[1] += 1
return permutations
def swap(self, nums, index1, index2):
tmp = nums[index2]
nums[index2] = nums[index1]
nums[index1] = tmp
return nums
我应该得到:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
但是我得到了:
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
答案 0 :(得分:3)
您一直将对同一列表的引用添加到permutations
。
致电时:
permutations.append(p)
Python不会复制列表,而是添加一个引用。您只有一个列表。
您想要做的是:
permutations.append(p[:])
将复制一份。
答案 1 :(得分:2)
当您从nums
返回swap
时,您不是在制作副本,而是在返回相同的列表,以后将对其进行修改。您可以在返回时或在列表append
上复制结果时进行复制。
答案 2 :(得分:1)
这是很多代码中的常见错误。您在此处看到的错误是从swap
返回的值与nums
相同的症状。这意味着您要一遍又一遍地将nums
附加到排列列表中。如果要打印整个permutations
列表而不是仅打印p
,您会发现它们始终相同。
解决方案非常简单:在代码中的某个点(可能是交换位置或某些位置),您需要复制nums
列表。